본문 바로가기

카테고리 없음

포인터 배열과 배열 포인터

 

포인터 배열이란 배열 요소로 포인터 변수를 가지는 배열을 의미한다.

즉, 포인터 변수를 저장할 수 있는 배열을 의미한다.

 

배열은 메모리공간을 사용자 마음대로 접근하며 데이터를 넣고 수정할 수 있는 특징이 있고,포인터 같은 경우에는 특정 메모리에 주소값을 가지고 있어서 간접참조를 하는 방식이다.

 

즉 포인터 배열은 주소값들을 저장하는 배열 이다.

 

배열 포인터는 배열의 시작주소값을 저장할 수 있는 포인터 이다.

 

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];

이렇게 선언 가능하다.