본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #47 배열포인터

배열포인터에 대해 알아봅시다.

우선 배열포인터는 포인터배열과는 다른겁니다.

이름이 비슷해서 헷갈릴수 있죠.


포인터배열은 저번에도 말했듯이 포인터변수를 담을수 있는 배열입니다.

그에비해 이번에 배울 배열포인터는 배열을 가리키는 포인터변수입니다.


사실 근데 배열 이름은 첫번째 원소의 주소를 가리키고있는 상수 포인터라고 배운적이 있잖아요?


그래서

arr[i]

*(arr+i)

이 둘은 같다고 볼수있죠.


배열포인터라는건 결국 그 포인터 상수를 가리키는 포인터라고 볼수 있기때문에 이중포인터라고도 볼수 있습니다.

이중포인터에 대해서는 저번 46강에서 설명해드렸었죠.


배열포인터는 보통 다차원배열에 접근할때 쓰입니다.


1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(void) {
    int arr[2][3= {{0,1,2},{3,4,5}};
    int (*parr)[3= arr;
    
    printf("%d",parr[0][2]);
}
cs



이런식으로 다차원배열처럼 사용할수 있습니다. 위 코드의경우 출력결과는 2가 나옵니다.

parr은 다차원배열처럼 위 그림과 같이 가리키게됩니다.

사실상 arr을 쓰던지 parr을 쓰던지 똑같이 접근이 가능하죠.



근데 그러면 결국 배열포인터를 왜쓸까요?


포인터변수 parr과 배열 arr은 결정적인 차이가 있습니다.

arr은 상수고 parr은 변수입니다. parr은 언제든지 다른 배열도 가리킬수 있는것이죠.

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    int arrA[2][3= {{0,1,2},{3,4,5}};
    int arrB[2][3= {{5,4,3},{2,1,0}};
    int (*parr)[3= arrA;
    printf("arrA: %d\n",parr[0][2]);
    parr = arrB;
    printf("arrB: %d\n",parr[0][2]);
}
cs

출력결과:


arrA를 가리키고있는 배열포인터 parr을 arrB를 가리키게 바꿀수 있습니다.