포인터 배열이란?
int *p[5];
이 선언의 의미는 다음과 같습니다:
“정수형(int)을 가리킬 수 있는 포인터 변수 5개를 배열로 선언한다.”
- p는 배열입니다.
- p[0], p[1], ..., p[4]는 각각 int형을 가리킬 수 있는 포인터 변수입니다.
즉, p[0], p[1], p[2] … 하나하나가 다음선언과 같습니다:
int *p0;
int *p1;
int *p2;
...
→ 이들을 하나의 배열로 묶은 것이 int *p[5];입니다.
포인터 배열과 일반 배열의 차이
일반 배열:
int arr[5]; // 정수형 5개짜리 배열
포인터 배열:
int *p[5]; // int형 포인터 5개짜리 배열
- 일반 배열은 값을 저장
- 포인터 배열은 주소(다른 변수를 가리키는 주소)를 저장
포인터 배열의 동작 방식
예시 코드:
int a = 3; p[1] = &a; // p[1]은 a의 주소를 저장 (p[1]이 a를 가리킨다)
이후 다음과 같이 접근할 수 있습니다:
printf("%p\n", p[1]); // 주소 출력 (a의 주소)
printf("%d\n", *p[1]); // 값 출력 (a가 가진 값 = 3)
꼭 기억할 것
💡 p[1]은 포인터입니다. *p[1]은 p[1]이 가리키는 메모리 값(즉, 변수 a의 값)입니다.
이해 포인트:
- p[1] = 주소 (예: 0x100)
- *p[1] = 그 주소에 저장된 값 (예: 3)
혼동 주의! *p[0], *p[1] 표현
포인터 배열에서는 반드시 이렇게 생각하세요:
- p[0]은 포인터 변수 (주소 저장)
- *p[0]은 그 주소에 접근한 값
📌 절대 *p[0]이 "p의 0번째 값"이라는 식으로 혼동하면 안 됩니다!
*는 역참조로, 주소를 따라가서 "실제 값"을 꺼내는 역할입니다.
예제
int a = 3;
int *p[5]; // 포인터 배열 선언
p[1] = &a; // p[1]이 a를 가리킴
printf("%p\n", p[1]); // 주소 출력 → &a
printf("%d\n", *p[1]); // 값 출력 → 3
전체 정리
int *p[5] | 포인터 변수 5개를 묶은 배열 |
p[1] | int형 변수의 주소를 저장 가능 |
p[1] = &a | p[1]이 변수 a를 가리킴 |
*p[1] | a의 값 (역참조) |
p[1] | a의 주소 |