Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 배열 포인터 (pointer to an array) 본문

C언어

C언어 - 배열 포인터 (pointer to an array)

깅햄찌 2022. 9. 17. 17:42
반응형

안녕하세요 오늘은 배열 포인터에 대해 정리해보고자 합니다.

 

1. 배열 포인터 선언

2. 배열 포인터의 활용 방법

 

배열 포인터에 알아보기 전 주소와 정수 연산에 개념을 먼저 정리해봅시다. 

아래 코드는 배열 요소 주소 혹은 배열의 주소가 정수 연산 시 주소 값의 변화를 출력합니다. 

#include <stdio.h>

int main(){
    int arr[2][3] = {
        {1,2,3},
        {4,5,6}
    };
    
    printf("address of arr\n");
    printf("&arr                    : %u\n", &arr);
    printf("&arr + 1                : %u\n\n", &arr + 1);
    printf("address of arr[0]\n");
    printf("&(arr[0])               : %u\n", &(arr[0]));        // arr
    printf("&(arr[0]) + 1           : %u\n\n", &(arr[0]) + 1);  // arr + 1
    printf("address of arr[0][0]\n");
    printf("&(arr[0][0])            : %u\n", &(arr[0][0]));
    printf("&(arr[0][0]) + 1        : %u\n\n", &(arr[0][0]) + 1);

    return 0;
}

&arr : arr 배열의 주소 

&arr + 1: arr배열의 주소에 arr배열의 크기 만큼 더한 것과 같습니다 =>  &arr + (1 * sizeof(arr)) 

arr는 2행3열의 정수형 배열이므로 크기는 24byte 

아래 결과에서 알 수 있듯이 &arr의 주소 값은 480, &arr + 1의 주소 값은 504입니다. 

 

&arr[0] : arr[0] 배열의 주소 (arr와 같습니다!)

&(arr[0]) + 1: arr[0]배열의 주소에 arr[0]배열의 크기만큼 더한 것과 같습니다 =>  &arr + (1 * sizeof(arr[0])) 

arr[0]는 3열의 정수형 배열이므로 크기는 12byte 

아래 결과에서 알 수 있듯이 &arr[0]의 주소 값은 480, &(arr[0]) + 1의 주소 값은 492입니다. 

 

&arr[0][0] : arr[0][0] 배열의 주소 

&(arr[0][0]) + 1: arr[0][0]배열의 주소에 arr[0][0]배열의 크기만큼 더한 것과 같습니다 =>  &arr + (1 * sizeof(arr[0][0])) 

arr[0][0]는 정수형 변수이므로 크기는 4byte 

아래 결과에서 알 수 있듯이 &arr[0][0]의 주소 값은 480, &(arr[0][0]) + 1의 주소 값은 484입니다. 

 

1. 배열 포인터 선언

배열 포인터는 다음과 같이 선언할 수 있다.

자료형 + (간접 참조 연산자 + 포인터 변수) + 배열 연산자

e.x) int (*pt)[3], char (*pt)[5]

#include <stdio.h>

int main(){
    int arr[2][3] = {
        {1,2,3},
        {4,5,6}
    };

    int (*pt)[3];

    pt = arr;

    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            printf("%3d",pt[i][j]);
        }
        printf("\n");
    }

    return 0;
}

위의 코드에서 pt라는 배열 포인터를 선언했습니다.

int(*pt)[3]는 정수형 변수 3개의 요소를 가지는 배열을 가리키는 포인터라는 뜻입니다.  

arr(배열의 주소)가 pt에 할당되어 pt로 arr의 요소를 접근하고 아래와 같이 정상적으로 출력됨을 확인했습니다. 

 

2. 배열 포인터의 활용 방법

배열 포인터는 2차원 배열의 배열명을 받는 함수의 매개변수로 활용됩니다.

#include <stdio.h>

void print_arr(int (*pt)[3]){

    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            printf("%3d",pt[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            printf("%3d",*(*(pt + i)) + j);
        }
        printf("\n");
    }

}

int main(){
    int arr[2][3] = {
        {1,2,3},
        {4,5,6}
    };

    print_arr(arr);

    return 0;
}

2행 3열의 정수형 배열 arr가 배열 포인터 pt에 할당되고 

배열 표현으로 출력

포인터 표현으로 출력되었습니다. 

아래 결과와 같이 정상적으로 배열 포인터를 이용하여 arr요소에 접근한 것을 확인할 수 있습니다. 

 

오늘은 배열 포인터에 대해 정리해보았습니다.

1. 배열 포인터 선언

2. 배열 포인터의 활용 방법

이전 배열이나 포인터 관련 포스팅을 참고하시면 더욱 도움이 될거 같습니다. 

 

좋은 하루 보내세요~~

Comments