포인터

개념

  • pointer
  • 자료형의 한 종류로, 메모리의 주소를 다루는 자료형이다.
  • 어떤 변수의 자료형을 포인터로 지정해 선언했다면, 그 변수는 메모리 주소값을 가진다.
  • 포인터 변수 : 메모리 주소값을 값으로 가지는 변수
1
2
int*    --> 자료형 (정수형 자료를 가리키는 포인터 타입)
int* p; --> 포인터형 변수 p

메모리의 주소

  • 프로그램이 실행되면, 모든 변수는 메모리의 특정한 위치에 저장된다.
  • 이 위치를 식별하기 위해 메모리를 주소(address)를 가진다.
  • 메모리 주소는 보통 16진수 값(e.g. 0x000f12a)으로 표현된다.
  • 변수 이름은 값 자체가 아니라, 해당 값이 저장된 메모리 주소를 참조하기 위한 별칭이다.
1
int a = 10;

위 코드에서 a는 정수 10이라는 값이 저장된 메모리 공간의 별칭이다. 이때 a가 실제로 저장된 위치가 바로 메모리의 주소이다. 그렇다면 메모리의 주소를 한 번 출력해보자.

1
2
printf("%p", &a);
// >> 0x1000

&연산자는 지정한 변수가 가리키는 메모리의 주소를 반환하는 주소 연산자이다. 포인터는 바로 이 메모리 주소 값을 저장하기 위해 존재한다.

물리적인 메모리 구조 살펴보기

1
2
3
4
5
6
7
8
9
int a = 10;
int b = 20;
int arr[3] = {30, 40};
printf("%p", &a);
// >> 0x1000
printf("%p", &b);
// >> 0x1004
printf("%p", &arr);
// >> 0x1008

변수 a 에 정수값 10을 할당했고, 변수 a에 대한 주소값이 0x1000일 때, 물리적인 저장 구조는 아래와 같이 그릴 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
메모리 영역 (int = 4byte 기준)
────────────────────────────────────────

주소        저장된 값     의미
────────────────────────────────────────
0x1000  │    10       │  a (int)
0x1004  │    20       │  b (int)
0x1008  │    30       │  arr[0]
0x100C  │    40       │  arr[1]
0x1010  │     0       │  arr[2]

────────────────────────────────────────

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments