포인터 문법

문성원·2024년 1월 4일
0

1) 목표

  • 포인터 문법의 기본 사항에 대해서 살펴보고 이해하기
  • 포인터 문법을 왜 사용하는 지에 대해서 이해하기
  • (번지 지정 연산자), &(번지 계산 연산자), type (포인터 변수) 등의 연산자 익히기

2) 소스코드

// Pointer.cpp 
// 포인터 문법 소개

#include "pch.h"
#include <stdio.h>	// printf 함수를 사용하기 위해

// main 함수에 들어 있는 값 1 증가 시키기
char IncData(char* p_num, char* p_num1)
{
	(*p_num)++;
	(*p_num1)++;
}

int main()
{
	// 컴퓨터의 메모리를 사용하려면 메모리의 크기, 주소가 필요함
	// 변수의 주소 -> a라고 선언한 곳의 위치, 자료형 -> 메모리의 할당 크기가 1byte
	char a = 5;

	// 주소를 얻을 때에는 &(번지 계산)연산자 사용(단항 연산자)
	// 주소를 사용할 때는 *(번지 지정)연산자 사용(단항 연산자)
	*& a = 5;

	// 고 <---	---> 저(stack 메모리에 쌓이는 구조) -> 1Mbyte
	// 6이 정상적으로 출력되지만, 에러 창(경고 메시지)로 메모리 침범했다는 문구 발생(디버그 모드)
	// 컴파일러가 변수를 메모리에 배치할 때 12의 배수에 해당하는 주소에 배치
	*(&a - 1) = 6;
	printf("a = %d\n", *(&a - 1));
	// -52라고 적으면 메모리 침범했다는 문구를 발생시키지 않음
	*(&a - 1) = -52;
	
	// 하나의 값을 증가시킬 경우에는 이렇게 변수 하나를 선언하고 함수를 호출하여 변화시키는 것이 가능
	// 그런데 만약에 값이 2개 이상 선언되고 한 번에 변화시키고 하는 경우에는?
	// 함수에 선언되어 있는 리턴문도 변수 하나만 변화시키는 것이 가능하다.
	// 이 때 사용하는 것이 주소를 사용해서 바꿔주면 된다. 
	// 주소는 자기 자신을 가리킬 때에는 4byte를 차지한다.
	// 매번 형변환하면서 주소를 참조하면서 값을 바꾸는 것이 여간 번거롭기에 
	// 함수의 반환형을 제거하고 매개변수를 포인터 변수로 사용
	char b = 4, c = 5;
	IncData(&a, &b);
	printf("num1: %hhd\nnum2: %hhd", a, b);
	
	
	// 프로그램 종료
	return 0;
}

3) 이해한 내용 정리

  • 컴퓨터의 메모리를 사용하여 연산을 하고자 하는 경우 메모리의 공간을 할당할 자료형, 주소를 할당할 변수명을 사용
  • 주소를 얻을 경우에는 "&" 연산자를 사용하여 선언한 변수의 주솟값을 참조한다. 즉, &연산자를 사용할 경우 이 변수는 포인터 자료형을 가지게 됨.
  • 주소를 가져올 경우 "*"연산자를 사용하여 주소에 들어있는 값을 참조한다.
// 둘은 서로 같은 표현
&*data = 5;
data = 5;
  • 함수에 포인터 변수를 사용하여 호출자 함수(메인 함수)에서 즉시 주솟값을 받아와 즉시 값을 수정하여 다시 메인에 보낸다.

4) 출처

본 작성글은 금배씨 영상 강의 중 "포인터 문법 소개" 를 바탕으로 작성되었습니다

profile
EasyWin32를 통해 C언어를 공부하고 있습니다~

0개의 댓글

관련 채용 정보