포인터 배열은 배열의 요소가 포인터인 배열이다. 배열의 각 요소가 메모리 주소(다른 변수의 주소)를 저장하는 포인터이다. 쉽게 말해, 포인터 배열은 주소값들을 저장하는 배열을 말한다.
int *arr[5];
arr
는 크기가 5인 포인터 배열.arr
는 5개의 포인터를 저장할 수 있으며, 각 포인터는 int
형 변수를 가리킴.int a = 10, b = 20, c = 30;
int *arr[3]; // 포인터 배열 선언
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
for (int i = 0; i < 3; i++) {
printf("arr[%d]가 가리키는 값: %d\n", i, *arr[i]);
}
// 출력
arr[0]가 가리키는 값: 10
arr[1]가 가리키는 값: 20
arr[2]가 가리키는 값: 30
arr[0]
, arr[1]
, arr[2]
는 각각 a
, b
, c
의 주소를 가리키는 포인터. *arr[i]
로 배열 요소가 가리키는 값을 출력할 수 있음.#include <stdio.h>
int main() {
int a = 5, b = 10;
int *array1[2] = { &a, &b };
int *array2[2] = { &a, &b };
int *array3[2] = { &b, &a };
// 포인터 배열의 주소값 비교
if (array1[0] == array2[0] && array1[1] == array2[1]) {
printf("array1 and array2 point to the same addresses.\n");
} else {
printf("array1 and array2 point to different addresses.\n");
}
if (array1[0] == array3[0] && array1[1] == array3[1]) {
printf("array1 and array3 point to the same addresses.\n");
} else {
printf("array1 and array3 point to different addresses.\n");
}
return 0;
}
array1
과 array2
는 동일한 주소값을 저장하고 있으므로 array1[0] == array2[0] && array1[1] == array2[1]
는 참(True).array1
과 array3
는 다른 순서로 주소값을 저장하고 있으므로 array1[0] == array3[0] && array1[1] == array3[1]
는 거짓(False).포인터 배열을 비교할 때는 실제로 포인터가 가리키는 주소값을 비교하는 것이지, 그 주소에 저장된 값을 비교하는 것이 아닙니다. 포인터가 가리키는 값 자체를 비교하려면 다음과 같이 역참조 연산자
*
를 사용해야 한다:if (*array1[0] == *array2[0] && *array1[1] == *array2[1]) { printf("Values pointed to by array1 and array2 are the same.\n"); } else { printf("Values pointed to by array1 and array2 are different.\n"); }
배열 포인터는 배열 자체를 가리키는 포인터이다. 즉, 포인터가 배열 전체를 가리키며, 이 포인터를 통해 배열에 접근할 수 있다. 배열 포인터는 배열의 시작 주소값을 저장할 수 있다.
int int (*ptr)[5];
ptr
는 크기가 5인 정수로 이루어진 배열을 가리키는 포인터.ptr
는 배열의 시작 주소를 저장하며, 배열의 첫 번째 요소뿐만 아니라 전체 배열을 가리킴.int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr; // 배열 포인터 선언 및 초기화
for (int i = 0; i < 5; i++) {
printf("arr[%d]의 값: %d\n", i, (*ptr)[i]);
}
arr[0]의 값: 1
arr[1]의 값: 2
arr[2]의 값: 3
arr[3]의 값: 4
arr[4]의 값: 5
ptr
은 배열 arr
의 시작 주소를 가리키고 있으며, (*ptr)[i]
를 통해 배열의 각 요소에 접근할 수 있음. *ptr
은 배열 자체를 나타내므로, 배열처럼 인덱스를 사용하여 배열 요소를 접근할 수 있음.구분 | 포인터 배열 (Array of Pointers) | 배열 포인터 (Pointer to an Array) |
---|---|---|
정의 | 포인터들을 요소로 가지는 배열 | 배열 전체를 가리키는 포인터 |
메모리 구조 | 각 배열 요소는 다른 메모리 위치를 가리킬 수 있는 포인터를 저장 | 배열의 시작 주소를 가리키며 배열 내 모든 요소가 연속된 메모리에 있음 |
선언 방법 | int *arr[5]; (포인터 5개를 저장하는 배열) |
int (*ptr)[5];
(5개의 정수 배열을 가리키는 포인터)
|사용 예|여러 변수를 가리키는 포인터들을 저장하고 관리하는 데 사용| 다차원 배열을 처리하거나 함수의 매개변수로 배열을 전달할 때 사용|
int *arr[3]; // 3개의 포인터를 저장하는 배열
int (*ptr)[3]; // 크기가 3인 배열을 가리키는 포인터
포인터 배열은 다양한 주소를 관리할 수 있고, 배열 포인터는 배열을 한 번에 처리할 수 있는 방법을 제공한다.