지금까지의 데이터를 저장하기 위하여 변수를 선언한 것은 선언할 때 명시한 변수의 자료형의 크기에 따라 주기억장치를 할당받는 것이고 변수를 사용한다는 것은 변수에 할당된 영역에 값을 저장하거나 저장된 값을 읽어서 사용한다는 것을 의미한다.

int var;
var = 10;
printf("%d\n", var);

 

포인터주소를 저장하기 위한 변수다. 

포인터를 사용하는 이유는 값을 간접참조(우회적으로 참조)하기 위한 것이다.

예시를 보자. 아래 예시는 위의 예시와는 다르다.(위의 예에서 var을 직접 사용하지 않고 *ptr을 사용하여 간접 참조한다.)

int *ptr;
ptr = &var;
printf("%d\n", *ptr);

 

여기서 포인터 연산자(*)와 주소 연산자(&)의 의미를 배워보자.

 

포인터 

char *p_chr;
int *p_int;
double *p_dbl;

 

char *p_chr; >> p_chr이 가리키는 곳에 char형 값이 있다. 

char *p_int; >> p_int이 가리키는 곳에 int형 값이 있다. 

char *p_dbl; >> p_dbl이 가리키는 곳에 double형 값이 있다. 

 

주의!!

주소의 크기는 같으므로 포인터의 크기는 같다.

printf("문자형과 포인터의 크기: %d, %d\n", sizeof(char), sizeof p_chr);
printf("정수형과 포인터의 크기: %d, %d\n", sizeof(int), sizeof p_int);
printf("실수형과 포인터의 크기: %d, %d\n", sizeof(double), sizeof p_dbl);

// 문자형과 포인터의 크기: 1, 4
// 정수형과 포인터의 크기: 4, 4
// 실수형과 포인터의 크기: 8, 4

 

>> 포인터의 크기는 모두 4바이트(32비트 컴파일러일 경우)로 같다. 이유는 주소를 표현하는 크기는 같기 때문이다. 

>> 예를 들자면 건물의 크기는 다양하지만, 주소의 길이는 비슷한 것과 같은 이치이다. 

 

주소연산자 (&)

int amt, *p_amt;

amt = 100;
p_amt = &amt;

 

일반 변수 amt를 선언하고 포인터 연산자 *와 연산자 &를 사용하여 amt 변수의 시작주소를 p_amt에 저장하는 예시이다.

밑에 그림은 어떻게 흐름이 이어나가는건지 그림으로 나타낸 것이다. 

amt의 시작주소가 1004인데 그거를 p_amt = &amt를 통해서 amt의 시작주소를 p_amt에 저장한다.

 

 

포인터 연산자 (*)

지금 현재 p_amt에는 amt의 시작주소인 1004가 저장되어 있는 것이다. 

그렇다면 p_amt가 아닌 p_amt가 가리키는 곳을 참조하고 싶을 때는 포인터 연산자 (*)를 사용해야한다.

포인터는 자료의 시작주소만을 저장하고 있고 포인터의 자료형 크기에 따라 마지막 주소가 결정된다.

즉 p_amt는 정수형 포인터이고 4바이트를 참조하므로 시작주소는 1004번지이고 끝 주소는 1007번지가 된다.

*p_amt는 1004-1007번지의 값을 읽어오는 수식으로 p_amt로 amt를 간접참조한다. 

따라서 amt == *p_amt 수식은 참이다. 

 

 

'프로그래밍 > C,C++' 카테고리의 다른 글

포인터 예제  (0) 2024.06.11
다양한 함수와 변수의 참조 범위  (0) 2024.05.30
문자열 처리  (0) 2024.05.28
인수 전달하는 함수  (0) 2024.05.28
인수 전달하지 않는 함수  (0) 2024.05.27

+ Recent posts