2023.1.16 최초 작성
포인터는 다른 변수를 가리키는 변수를 이야기하는데 주소를 기억하고 있다가 해당 주소를 찾아간다.
포인터 변수는 주소만 기억할 수 있다. 직접 값을 가지는 것이 아니라 다른 곳에 있는 변수의 주소를 기억하는 것을 포인터라고 한다.
그렇다면 포인터를 참조 변수라고 이야기할 수 있을까?
결론은 참조의 정의를 어떻게 하느냐에 따라 다르다. C++ 언어에서는 &기호를 이용하는 참조 변수라는 개념이 있다. 넓은 의미로는 직접 값을 가지지 않고 주소를 기억하였다가 찾아가는 포인터도 참조 변수라고 할 수 있으나 좁은 의미로는 포인터를 진정한 참조 변수라고 이야기하기는 좀 어렵다.
그러나 넓은 의미로 주소를 통해 찾아가는 것을 참조라고 이야기해도 아주 크게 틀린 것은 아니라고 생각된다. 결론은 보는 관점과 기준에 따라 다른데 직접 참조보다는 간접 참조라고 하는 것이 맞다.
포인터 변수에 기억된 주소의 공간에 실제로 저장된 있는 값에 접근하는 것을 역참조 또는 간접 참조라고 하고 포인터 앞에 * 연산자를 사용하는데 이것을 역참조 연산자 또는 간접 참조 연산자라고 한다.
아래 코드는 포인터 변수를 사용한 예제이다.
#include <stdio.h>
void main() {
int* p1;
int** p2;
int*** p3;
int a = 10;
p1 = &a;
p2 = &p1;
p3 = &p2;
printf("%p, %d\n", &a, a);
printf("%p, %p, %d\n", &p1, p1, *p1);
printf("%p, %p, %p, %d\n", &p2, p2, *p2, **p2);
printf("%p, %p, %p, %p, %d\n", &p3, p3, *p3, **p3, ***p3);
}
[실행 결과]
000000D4FC9BF6C4, 10
000000D4FC9BF668, 000000D4FC9BF6C4, 10
000000D4FC9BF688, 000000D4FC9BF668, 000000D4FC9BF6C4, 10
000000D4FC9BF6A8, 000000D4FC9BF688, 000000D4FC9BF668, 000000D4FC9BF6C4, 10
p1은 자료형이 int* 인데 int 타입 변수의 주소를 기억하는 포인터 변수이다.
p2는 자료형이 int** 인데 int*타입 포인터 변수의 주소를 기억하는 2중 포인터 변수이다.
p3는 자료형이 int*** 인데 int**타입 포인터 변수의 주소를 기억하는 3중 포인터 변수이다.
'프로그래밍 > C' 카테고리의 다른 글
C언어 문자열 다루기 (0) | 2023.01.17 |
---|---|
CONST를 이용한 상수화 (1) | 2023.01.16 |
2차원 배열도 1차원 배열이다. (0) | 2023.01.09 |
배열의 이름은 주소이다. (0) | 2023.01.09 |
static 변수와 static 함수 (0) | 2023.01.09 |