본문 바로가기
[R&D] 프로그래밍/C, C++

[C/C++] 포인터(pointer)란? - 포인터의 기본 개념

by Geuni 2022. 7. 27. 01:37
728x90
반응형

포인터(Pointer) 란?

C언어에서 포인터란, 포인터 변수라고도 불리며 메모리의 주소 값을 저장하는 변수를 말합니다.

우리가 코딩을 할 때 사용하는 변수들은 을 가지고 있는데, 이 변수들은 모두 특정 메모리에 위치합니다. 여기서 변수가 가진 값은 메모리에 저장되고 그 메모리의 위치를 변수의 주소(address), 번지라고 합니다.

변수의 주소는 ' & '를 사용해 접근할 수 있고 포인터 변수는 ' * '을 사용하여 선언을 할 수 있습니다.

#include <stdio.h>

int main(void)
{
    char val = 5;
    char *pVal = &val;
    char **ppVal = &pVal;
    
    printf("  val size : %d / address : %p / value : %d\n", sizeof(val), &val, val);
    printf(" pVal size : %d / address : %p / value : %p / dereference : %d\n", sizeof(pVal), &pVal, pVal, *pVal);
    printf("ppVal size : %d / address : %p / value : %p / dereference : %p, %d\n", sizeof(ppVal), &ppVal, ppVal, *ppVal, **ppVal);
   
    return 0;
}
  val size : 1 / address : 0061FF15 / value : 5
 pVal size : 4 / address : 0061FF10 / value : 0061FF15 / dereference : 5
ppVal size : 4 / address : 0061FF0C / value : 0061FF10 / dereference : 0061FF15, 5

위 예제 코드를 통해 포인터 변수의 몇 가지 특징을 확인해 볼 수 있습니다.

1. 포인터 변수는 자료형의 크기와 다르다.
포인터 변수는 메모리의 '주소'를 저장해야 하기 때문에 시스템의 word 크기가 곧 포인터 변수의 크기가 됩니다.
만약 64비트 운영체제라면 포인터 변수의 크기는 8Byte가 됩니다.


2. 포인터 변수는 (*) 를 사용해 해당 주소에 저장된 값을 가져올 수 있다.
일반적인 변수를 사용할 때는 변수명을 통해 저장된 값을 가져와서 사용합니다.
하지만 포인터 변수는 (*)을 앞에 붙여 " *pVal "와 같이 가지고있는 주소에 위치한 값을 가져올 수 있습니다.
이를 '역참조'라고 하며 사용된 (*)을 역참조 연산자라고 합니다.

3. (*)을 2개 이상 사용 가능하다.
3번째 변수인 ppVal을 보면 앞에 (*)을 두개 붙여서 선언했습니다. 이는 '이중포인터'라고 불리는데,
포인터 변수인 pVal의 주소를 가지고 있으며 마찬가지로 역참조를 통해 val에 접근할 수 있습니다.
자주 사용되진 않지만 마찬가지로 (*)을 더 붙이면 삼중포인터가 됩니다.

위 예제코드의 변수들이 메모리에 저장된 형태를 도식화한다면 아래와 같습니다.

위처럼 포인터 변수는 다른 변수나 포인터 변수의 주소값을 저장하고 있기 때문에 역으로 주소값을 참조하여 해당 주소가 가진 값에 접근이 가능한 것입니다.

 

포인터 변수도 결국 1word 크기의 숫자를 저장하는 하나의 변수일 뿐입니다. 다만 선언할 때 명시적으로 (*)을 통해 '역참조'가 가능하도록 기능이 부여된 변수라고 생각하면 편할 것 같습니다.

 

728x90
반응형

댓글