포인터
개념
- pointer
- 자료형의 한 종류로, 메모리의 주소를 다루는 자료형이다.
- 어떤 변수의 자료형을 포인터로 지정해 선언했다면, 그 변수는 메모리 주소값을 가진다.
- 포인터 변수 : 메모리 주소값을 값으로 가지는 변수
1
2
| int* --> 자료형 (정수형 자료를 가리키는 포인터 타입)
int* p; --> 포인터형 변수 p
|
메모리의 주소
- 프로그램이 실행되면, 모든 변수는 메모리의 특정한 위치에 저장된다.
- 이 위치를 식별하기 위해 메모리를 주소(address)를 가진다.
- 메모리 주소는 보통 16진수 값(e.g. 0x000f12a)으로 표현된다.
- 변수 이름은 값 자체가 아니라, 해당 값이 저장된 메모리 주소를 참조하기 위한 별칭이다.
위 코드에서 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