본문 바로가기
C++/포인터

[C++] 포인터란 무엇인가

by bigpicture 2022. 8. 11.
반응형

포인터는 변수입니다. 하지만 우리가 일반적으로 알고 있는 변수와는 다릅니다. 이러한 이유 때문에 포인터에 익숙해 지는데 시간이 좀 필요합니다. 지금부터 우리에게 익숙한 변수에서 출발하여 포인터가 무엇인지 배워봅시다. 

우리가 일반적으로 알고 있는 변수는 숫자나 문자를 입력할 수 있는 어떤 공간의 이름입니다. 각 변수는 메모리 공간을 갖습니다. 정수형 변수를 선언하고 값을 입력하는 아래 코드를 봅시다. 

int a=3;


위와 같이 선언할 경우 메모리 공간에 int 자료형의 크기인 4바이트가 할당됩니다. 할당된 4바이트 공간에 3이 입력됩니다. 메모리 공간에서 4바이트 만큼을 정한 뒤 a라는 이름을 붙인 것과 같습니다. 

이후 a라는 변수를 사용하게 되는데요. 우리가 a를 사용할 때마다 컴퓨터는 a라는 이름이 붙은 메모리 공간에 접근해야 합니다. 컴퓨터는 메모리 공간에 접근하기 위해 각 메모리 공간마다 '주소'라는 것을 붙여놓았습니다. 각 비트(bit)마다 주소를 갖습니다. 이 주소도 다른 메모리 공간 어딘가에 저장되어 있습니다. 

따라서 위에서 정의한 a라는 변수는 4개의 주소를 갖소 있습니다. a가 4비트의 정수이기 때문입니다. 그 중 첫번째 비트의 주소를 a의 주소라고 합니다. 

이 주소까지도 직접 활용하려고 만든 방법이 포인터입니다. 포인터에는 이 주소를 저장할 수 있습니다. 포인터는 변수의 주소를 저장하는 변수입니다. 포인터는 아래와 같이 선언합니다. 

int a=3;
int *p=&a;
    
cout<<p<<endl;


p앞에 붙은 *는 p가 포인터변수임을 나타냅니다. 데이터형이 int* 인 것입니다. 변수는 *p가 아니라 p라는 것을 기억하세요. 

 

&a 는 a의 주소를 의미합니다. 따라서 *p=&a 는 'p는 포인터변수이고 이 변수에 a의 주소를 입력한다' 는 의미입니다. 

 

포인터변수의 자료형은 주소를 가져오려는 변수와 같아야 합니다. 우리가 가져오려는 변수 a의 자료형이 int 이므로 포인터도 int형으로 선언합니다. 

p에 입력된 값을 출력해봅시다. 

#include <iostream>

using namespace std;

int main()
{

    int a=3;
    int *p=&a;
    
    cout<<p<<endl;

}

 

 

변수 a가 저장된 메모리의 첫 비트 주소값이 출력됩니다. 

 

포인터변수의 크기가 궁금하지 않나요? 한번 출력해봅시다. sizeof 연산자를 사용합니다. 

 

#include <iostream>

using namespace std;

int main()
{

    int a=3;
    int *p=&a;
    
    cout<<sizeof(p)<<endl;

}

 

결과는 8(바이트)입니다. int 의 크기는 4인데 int* 의 크기는 8인 것이 이상합니다. 이는 시스템에서 정한 값입니다. 제가 사용하는 컴퓨터는 주소값을 8바이트로 표현하는 시스템이기 때문입니다. 

반응형

댓글