포인터 한 단계
int a = 5;
int *p = &a;
a | 정수형 변수, 값은 5 |
p | 포인터 변수, a의 주소를 저장함 (p = &a) |
*p | p가 가리키는 곳의 값을 참조 → 즉 *p = a = 5 |
이중 포인터
int **p2 = &p;
- p2는 포인터의 포인터입니다.
- p2는 p의 주소를 저장합니다. 즉, p2가 가리키는 대상은 포인터 p입니다.
p2 | p의 주소 |
*p2 | a의 주소 |
**p2 | 5 |
삼중 포인터
int ***p3 = &p2;
- p3는 포인터의 포인터의 포인터입니다.
- p3는 p2의 주소를 저장합니다.
p3 | p2의 주소 |
*p3 | p의 주소 |
**p3 | a의 주소 |
***p3 | 5 |
a → 5
p → &a
p2 → &p
p3 → &p2
- 화살표는 “가리킴”을 의미합니다.
- 박스 구조로 변수들이 메모리에서 가리키는 관계를 시각화한 것입니다.
예시 흐름:
p3 → p2 → p → a → 5
즉,
- ***p3 == **p2 == *p == a == 5
이중 포인터의 역참조를 연습하는 부분입니다:
표현 | 의미 | 해석 |
*p2 | p | p2는 p의 주소니까 |
**p2 | a의 값 | *p == a == 5 |
*p3 | p2 | p3는 p2의 주소니까 |
**p3 | p | *p2와 같음 |
***p3 | a의 값 5 | 가장 깊이 있는 값을 꺼냄 |
→ 이걸 통해 “*을 하나 더 붙일수록 한 단계 더 들어간다”는 걸 알 수 있습니다.
몇 개의 *가 필요한가?
어떤 변수의 주소를 저장하려면 그 변수보다 *를 하나 더 붙여야 한다.
저장 대상 | 선언 방식 | 예시 |
int 변수 a의 주소 | int *p; | p = &a; |
int *p의 주소 | int **p2; | p2 = &p; |
int **p2의 주소 | int ***p3; | p3 = &p2; |
*의 개수는 몇 번의 참조를 할 수 있는가?
*p | 한 번 참조 → a의 값 |
**p2 | 두 번 참조 → a의 값 |
***p3 | 세 번 참조 → a의 값 |
결론
- 포인터는 “가리킨다” → 주소를 저장한다.
- 주소를 저장하려면 *를 하나 더 붙여야 한다.
- 역참조(*)의 횟수는 주소를 따라 몇 번 따라가야 하는지를 뜻한다.
- ***p3 = 5가 된다는 건 p3 → p2 → p → a → 5라는 구조로 연결되어 있다는 뜻입니다.
'C' 카테고리의 다른 글
2차원 배열 (0) | 2025.06.14 |
---|---|
포인터 배열 (0) | 2025.06.13 |
배열을 함수에 전달할때 동작방식 (0) | 2025.06.13 |
배열과 포인터 (0) | 2025.06.13 |
Call by Value vs Call by Address (0) | 2025.06.13 |