[C언어] 포인터(pointer) 이해하기

업데이트:

포인터(pointer) 이해하기

참고 링크

1.포인터 개념

포인터 변수: 메모리의 주소 값을 저장하기 위한 변수

변수는 여러가지 종류가 있습니다. 정수형, 실수형, 문자형 등.. 마찬가지로 포인터 변수도 변수의 한 종류입니다. 만약 int 형 변수를 선언 한다고 하면 아래와 같이 타이핑 하겠죠.

int a;
int b = 5;

위처럼 입력하면 첫번째 줄 처럼 int형 변수 a가 선언되고, 두번째 줄 처럼 int형 변수 b에 5라는 값을 넣으면서 초기화도 가능합니다.

반면 포인터 변수는 다른 변수들과는 선언 방식이 조금 다른데요, 포인터 변수는 다른 변수의 주소 값을 저장하는 변수입니다.

int * p;
p = &b

포인터 변수는 다른 변수의 주소값을 저장한다고 했습니다. 그럼 위의 예에서 포인터변수 p가 가리키는 주소값은 어떤 형태의 변수의 주소일까요? 별표 앞을 보시면 int라고 되어있죠. 포인터 변수 p는 int형 변수의 주소값을 가진다는 뜻입니다. 그럼 int형 변수는 엄청 많은데 어떤 int형 변수를 가리키는 걸까요? 두번째 줄에서 볼 수 있듯, 포인터변수 p는 int형 변수 b의 주소값을 가집니다.

헷갈릴수 있는데 포인터변수 p앞에 int가 있다고 해서 아, 포인터변수 p가 int형 변수구나라고 생각하시면 안됩니다. p가 int형 이라는 뜻이 아니라, p가 가리키고자 하는 변수의 자료형이 int인 것입니다. 따라서 포인터변수의 선언 형태만 보고도 포인터가 가리키는 변수의 자료형을 알 수 있습니다. 이를 그림으로 표현하면 아래와 같습니다.

int형 변수는 4바이트입니다. float형 변수도 4바이트죠. double형 변수는 8바이트 입니다. 그럼 포인터변수는 몇바이트 일까요? 포인터변수는 4바이트가 될 수도 있고 8바이트가 될 수도 있습니다. 32비트 시스템에서는 주소값을 32비트로 표현하기 때문에 포인터 변수의 크기가 4바이트인 반면, 64비트 시스템에서는 주소값을 64비트로 표현하기 때문에 포인터 변수의 크기가 8바이트 입니다.

  • 32bit 시스템 -> 포인터변수는 4바이트
  • 64bit 시스템 -> 포인터변수는 8바이트

void형 포인터 변수는 무엇이든 담을 수 있습니다. 즉, 어떠한 변수의 주소값이든 담을 수 있습니다. 심지어 함수의 주소값도 담을 수 있습니다.

void * ptr; 

2.출력

int b = 10; 
int* p = &b; 

cout << p << endl;   // 0x7ffc9191da6c
cout << *p << endl;  // 10