[C언어/C++] 포인터 배열, 배열 포인터의 사용법과 차이점

 포인터 배열이란? 

포인터 배열이란 말 그대로 포인터를 배열로 나열해놓은 것을 말합니다. 즉 포인터 변수의 배열이죠. 각각의 index에 여러 개의 포인터를 넣을 수 있습니다. 

char* arr[5];
int* arr[5];
void* arr[5];

위와 같이 선언하여 사용합니다. char* arr[5]는 5개의 char형 포인터를, int* arr[5]는 int형 포인터 5개를 저장하고 있는 배열이 됩니다. 그냥 단순 주소값만 저장하고 싶을 때는 주로 void로 선언하며 이렇게 선언할 경우 이후 어떤 타입이든지 변환이 가능합니다.

 

포인터 배열 활용 예제

#include <stdio.h>
int main() {
    int num1 = 100;
    int num2 = 200;
    int num3 = 300;
    
    int* arr[3] = { &num1, &num2, &num3 };
    
    for (int i = 0; i < 3; i++) {
        printf("arr[%d] = 주소값 : %p / 값 :%d\n",i,arr[i], *arr[i]);
    }
}

크게 어려운 내용은 아니기에 위의 예제를 보시면 바로 이해가 되실 겁니다. 정말 단순히 포인터를 배열로 나열해놓은 것에 불과합니다.

 

위와 같이 포인터 배열의 Index마다 참조하는 주소값을 저장하여 활용할 수 있습니다. 

 

 배열 포인터란? 

배열 포인터란 배열을 가리키는 포인터를 말합니다. 배열은 변수들을 메모리상에 일렬로 나열해놓은 것과 마찬가지입니다. 배열도 메모리상에 존재하므로 엄연히 주소값이 존재합니다. 배열 포인터란 이 주소값을 가리키는 포인터를 말합니다. 이것이 유용한 이유는 바로 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있기 때문입니다. 함수에 2차원 이상의 배열을 파라미터로 던질 때 유용하게 사용됩니다.

 

배열의 주소값

#include <stdio.h>
int main() {
    int arr[3][3] = { {10, 20, 30}, {100, 200, 300}, {100, 200, 300}};
    
    printf("arr의 주소값 : %p\n", &arr);
    
    for (int i = 0; i < 3; i++) {
        printf("arr[%d]의 주소값 : %p\n",i, &arr[i]);
        
        for (int j = 0; j < 3; j++) {
            printf("arr[%d][%d]의 주소값 : %p / 값 :%d\n", i, j, &arr[i][j], arr[i][j]);
        }
    }
}

위의 예제처럼 배열에 주소값을 찍어서 값을 확인하실 수 있습니다. 위의 예제에서 알 수 있듯 2차원 배열 arr은 arr[0][0]의 주소와 같으며 int형 배열이므로 주소값이 4씩 증가하는 것을 확인할 수 있습니다.

또한 2차원 배열을 선언하여 주소값을 확인해보면 1차원 배열의 주소는 2차원 배열의 [x][0]번째 주소를 가리킨다는 것을 알 수 있고 2차원 배열의 주소는 2차원 배열의[0][0]의 주소를 가리킨다는 것을 확인하실 수 있습니다. 이러한 성질을 활용하여 배열 포인터를 다양한 곳에서 활용할 수 있습니다.

 

배열 포인터 활용 예제 (2차원 배열을 함수의 파라미터로 보낼 때)

#include <stdio.h>
void change_array(int(*arr)[3]) { //배열 포인터
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            arr[i][j] = 0; //arr의 값 0으로 변경
        }
    }
}

int main() {
    int arr[3][3] = { {10, 20, 30}, {100, 200, 300}, {100, 200, 300}};
	
    change_array(arr);

    //출력
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("arr[%d][%d] : %d ", i, j, arr[i][j]);
        }
        printf("\n");
     }
}

함수에서 다차원 배열을 파라미터로 받아야 할 때 배열 포인터를 활용할 수 있습니다. 위와 같이 C언어의 함수에서 다차원 배열의 파라미터를 받을 때는 위와 같이 인자값에 배열 포인터를 넣어주어야 합니다.

댓글(2)

  • 2021.01.31 00:06 신고

    정말 오랫만에 포인터 기초를 공부하던 군 의무복무시절을 생각나게 하는 포스트를 올려주셨네요...
    지하 통신벙커에서 야간 근무를 서며 통신 계측기에 달린 6인치??? 쯤 되는 흑백 CRT와 플로피...그리고 뚜껑에 달린 키보드로 포인터 공부를 하던 시절이었는데.. 새록새록 기억이 떠오르네요..
    C언어는 개발자나 엔지니어에겐 필수적으로 공부해볼만한 그런 언어죠.

    • 2021.01.31 14:55 신고

      안녕하세요. 저도 요즘 C언어를 보고 있어서 이렇게 포스팅도 하게 되네요. 방문해주셔서 감사합니다.

Designed by JB FACTORY