포인터 배열이란 배열 요소로 포인터 변수를 가지는 배열을 의미한다.
즉, 포인터 변수를 저장할 수 있는 배열을 의미한다.
배열은 메모리공간을 사용자 마음대로 접근하며 데이터를 넣고 수정할 수 있는 특징이 있고,포인터 같은 경우에는 특정 메모리에 주소값을 가지고 있어서 간접참조를 하는 방식이다.
즉 포인터 배열은 주소값들을 저장하는 배열 이다.
배열 포인터는 배열의 시작주소값을 저장할 수 있는 포인터 이다.
int* arr[3] = {&num01, &num02, &num03};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int i, arr_len;
int num01 = 10, num02 = 20, num03 = 30;
int* arr[3] = {&num01, &num02, &num03}; // int형 포인터 배열 선언
arr_len = sizeof(arr)/sizeof(arr[0]);
for (i = 0; i < arr_len; i++)
{
printf("%d\n", *arr[i]);
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
위의 코드는 포인터 배열의 코드이고
실제 위의 코드가 메모리 상에서 어떻게 동작하는지 보여주는 그림이다.
앞서 배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다고 했는데 이렇게 배열 이름이 있는데도 따로 배열 포인터를 정의하여 사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있도록 하기 위해서이다.
즉, 포인터를 배열처럼 사용하기 위해서 배열 포인터를 정의하여 사용한다.
따라서 배열 포인터는 1차원 배열에서는 아무런 의미가 없으며, 2차원 이상의 배열에서만 의미를 가지고 있다.
2차원 배열에서는 포인터 연산 시 증가하는 값이 행의 길이에 따라 차이를 보이게 된다.
2차원 배열의 행의 길이란 부분 배열의 크기를 의미하며, 다음 수식으로 구할 수 있다.
수식 = sizeof(타입) * sizeof(arr[0])
int arr[2][3]의 특징은
1. 배열의 이름 arr는 int형 데이터를 가리키는 배열 포인터이다.
2. 이 배열 포인터는 포인터 연산 시 증감하는 값의 크기가 12바이트이다.
이 배열을 가리키는 포인터를 선언하면
int (*pArr)[3];
이렇게 선언 가능하다.