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언어 - 포인터 배열(array of pointer) 본문

C언어

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

깅햄찌 2022. 9. 15. 20:46
반응형

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

아래 목차 순으로 알아보아요~

1. 포인터 배열 선언 

2. 포인터 배열 초기화

3. 포인터 배열과 2차원 배열 

 

1. 포인터 배열 선언 

아래 코드에서 알 수 있듯이 포인터 배열은 "배열 요소의 자료형 + 배열명 + 배열 연산자" 와 같이 선언할 수 있습니다. 

예를 들면 char* parr1[5], int* parr2[3] 등 

#include <stdio.h>

int main(){
    char* parr[5];

    parr[0] = "apple";
    parr[1] = "bag";
    parr[2] = "cat";
    parr[3] = "dog";
    parr[4] = "egg";

    for(int i=0; i<5; i++){
        printf("%s\n",parr[i]);
    }

    return 0;
}

parr 요소에는 각 문자열의 주소가 할당되고 문자열 출력 시 '\0' 문자까지 출력됨으로

parr 요소에 할당된 문자열들이 올바르게 출력되는 것을 확인할 수 있습니다.

 

2. 포인터 배열 초기화

2022.09.14 - [C언어] - C언어 - 다차원 배열(N dimensional array)

 

C언어 - 다차원 배열(N dimensional array)

안녕하세요 오늘은 C언어에서 다차원 배열의 선언 및 초기화에 대해 정리해보고자 합니다. 1. 2차원 정수형 배열의 선언 아래 코드는 2차원 정수형 배열을 선언하고 모든 배열의 요소를 1로 초기

leggo-fire.tistory.com

이전 포스팅에서 2차원 배열의 초기화 방법을 참고하시면 포인터 배열의 초기화를 쉽게 이해하실 수 있습니다. 

포인터 배열의 초기화 역시 중괄호 안에 배열의 요소들을 저장하면 됩니다. 

예를 들어 정수형 포인터 배열은 배열의 시작 주소를, 문자형 포인터 배열은 문자열의 시작 주소를 저장하면 됩니다. 

Tips 2차원 문자형 배열의 초기화는 문자열 자체를 배열의 공간에 저장합니다.

#include <stdio.h>

int main(){
    int arr1[2] = {1,1};
    int arr2[2] = {2,2};
    int arr3[2] = {3,3};
    int* parr1[3] = {arr1,arr2,arr3};
    char* parr2[5] = {"apple", "bag", "cat", "dog", "egg"};

    return 0;
}

 

3. 포인터 배열과 2차원 배열

아래 코드는  포인터 배열을 배열 표현 & 포인터 표현 방법으로 출력하였습니다.  

#include <stdio.h>

int main(){
    int arr1[2] = {1,1};
    int arr2[2] = {2,2};
    int arr3[2] = {3,3};
    int* parr1[3] = {arr1,arr2,arr3};

    printf("print array fo pointer using 2 dimensional array printing way\n");
    for(int i=0; i<3; i++){
        for(int j=0; j<2; j++){
            printf("%d ",parr1[i][j]);
        }
        printf("\n");
    }
    printf("print array fo pointer using pointer printing way\n");
    for(int i=0; i<3; i++){
        for(int j=0; j<2; j++){
            printf("%d ",*(parr1[i]+j));
        }
        printf("\n");
    }

    return 0;
}

아래 결과에서도 알 수 있듯이 두 표현식은 같습니다. 

쉽게 이해하도록 arr1[1]의 출력 과정을 살펴보며 이해해 보겠습니다. 

배열 표현 :

parr1[0]은 arr1임으로 arr1의 시작 주소가 할당됩니다. parr1[0][1]은 arr1의 두 번째 요소 즉, arr1[1]을 가리키게 됩니다. 

포인터 표현 :

parr1[0]은 arr1임으로 arr1의 시작 주소가 할당됩니다.

parr1[0] + 1는 주소 + 정수 연산은 정수를 인덱스와 같이 간주합니다.

즉, 1은 1 * (sizeof(int))와 같은 표현이 됩니다.  

*(parr1[0] + (1 * sizeof(int)))는 결론적으로 parr1[0]는 arr1의 시작 주소, arr1의 시작 주소에서 4byte 뒤에 있는 주소를 가리키는 값 arr1[1]을 출력하게 됩니다. 

 

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

1. 포인터 배열 선언 

2. 포인터 배열 초기화

3. 포인터 배열과 2차원 배열 

포인터 배열은 언제나 헷갈리는 부분인데요. 오늘 포스팅이 조금이라도 이해하시는데 도움이 되었으면 좋겠습니다. 

좋은 하루 보내세요~~

Comments