본문 바로가기

C언어 프로그래밍

포인터란?


"메모리의 주소값을 저장하기 위한 변수이다"

 

포인터는 기본 자료형 변수와 달리 메모리 공간의 주소값을 저장하는데 사용되는 변수를 말하는 것이다.

 

그래서 흔히 포인터 변수라고 표현하는 것이다.

포인터는 const 키워드에 의해서 상수화되기도 한다. 그러나 이는 변수가 상수화되는 것이다.

 

sizeof연산자를 이용하여 포인터변수의 크기를 계산해 보면, 타입에 상관없이 그 크기가 4바이트임을 알 수 있다.

 

이는 컴퓨터의 주소 체계가 4바이트로 표현된다는 것을 의미한다.

(과거에는 메모리 주소를 나타내는데 2바이트를 사용해서 오래된 컴파일러는 여전히 포인터를 2바이트로 처리하는 것도 있다.)

 

포인터 선언

 

int main(void){

     int *a; char *b; double *c;
   //a라는 이름의 int형 포인터, b라는 이름의 char형 포인터, c라는 이름의 double형 포인터 

포인터는 참조하고자 하는 값의 주소를 저장하는 것이고 *(아스트리크)는 값의 주소로 이동해서 값을 참조하라는 뜻이다. 포인터를 선언할 때에는 *연산자를 사용한다. 그리고 포인터에도 형(type)이 존재한다.

 

형(type)이 존재하지 않는다면 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어들여야 하는지 알 수 없게 된다.

 

포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다.

int* a와 int *a 그리고 int * a는 같은 선언이다. 즉 int형 포인터 a를 선언한 것이다.

 

 

#include<stdio.h>                                                                                         -출력값-

 

int main(void){                                                                            1   0xbff21670   0xbffeeedec

   int arr[5]={1,2,3,4,5};                                                               2   0xbff21674   0xbffeeedec

   int *parr=arr;   //같은 표현은 int *parr; parr=arr;                           3   0xbff21678   0xbffeeedec

                                                                                                 4   0xbff21678   0xbffeeedec

   printf("%d   %p   %p\n", *parr, parr, &parr);                               5   0xbff21678   0xbffeeedec

   *(++parr);

   printf("%d   %p   %p\n", *parr, parr, &parr);

   *(++parr);

   printf("%d   %p   %p\n", *parr, parr, &parr);

   printf("%d   %p   %p\n", *(parr+1), parr, &parr);  

   printf("%d   %p   %p\n", *(parr+2), parr, &parr);

}

 

위에 값을 보면 *(++parr)에 parr가 증가 한 것처럼 보이지만 실제 자신의 위치주소는 변함이 없고 가리키는 주소값에만 변화가 있는 걸 볼 수 있다. 가리키는 주소값이 4씩 증가한 이유는 int형이 4바이트이기 때문에 +4된 다음 주소값을 가지는 것이다.