[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");
     }
}

2차원 배열 포인터

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

댓글

Designed by JB FACTORY