본문 바로가기
프로그래밍 언어/c(일반)

포인터(2) - 포인터 배열 / 배열 포인터

by [Akashic Records] 개발의선지자 2024. 7. 11.

해당 글은 개인 공부 정리를 위해 작성되었습니다.

포인터 배열

포인터 배열 : 배열 요소로 포인터 변수를 가지는 배열을 의미합니다. 즉, 포인터 변수로 이루어진 '배열'을 의미합니다.
포인터 배열은 기본 자료형 배열과 크게 다르지 않습니다. 다만 주소값을 저장할 수 있는 포인터 변수를 대상으로 선언된 배열일 뿐입니다.

 

선언 방법 : 자료형  * 배열명[크기] 

 

#include <stdio.h>
 
int main(void)
{
    int num1 = 1, num2 = 2, num3 = 3;
    int * arr[3] = { &num1, &num2, &num3 };    // 포인터 배열 선언 및 초기화
 
    printf("주소값 : %p %p %p\n", arr[0], arr[1], arr[2]);
    printf("값 : %d %d %d\n", *arr[0], *arr[1], *arr[2]);
 
    return 0;
}

 

문자열 배열은 문자열의 주소값을 저장하는 배열로서 사실 char형 포인터 배열입니다.
" " (큰 따옴표)로 묶인 문자열은 메모리 공간에 저장된 후 그 주소값이 반환됩니다. 그리고 저장된 메모리 공간의 시작 주소를 알려줍니다.
반환된 문자열의 주소값은 문자열 첫번째 문자의 주소입니다. 이렇게 char형 포인터 배열에 저장이 가능합니다.

 

#include <stdio.h>
 
int main(void)
{
    char * strarr[3] = {"sejong", "university", "computer"};    // 문자열 배열 선언 및 초기화
 
    printf("%s %s %s\n", strarr[0], strarr[1], strarr[2]);
 
    return 0;
}

 

 

배열 포인터

배열 포인터 배열을 가리킬 수 있는 '포인터'를 의미합니다.

1차원 배열은 이름 자체가 포인터이기 때문에 배열 포인터가 필요없습니다. 하지만 2차원 배열은 이름 자체로 포인터의 역할을 할 수 없습니다.
배열 포인터를 사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 배열처럼 사용하기 위함입니다.
따라서 배열 포인터는 2차원 이상의 배열에서만 의미를 가집니다.

 

선언 방법 : 자료형 (*포인터변수명)[가로(행)길이]

#include <stdio.h>
 
int main(void)
{
    int arr2d[2][3] = {
    {10, 20, 30},
    {40, 50, 60},
    };
 	
    int (*arrPtr)[2] = arr2d;
    printf("%d %d\n", (*arrPtr)[0], (*arrPtr)[1]);
 
    return 0;
}

 

포인터 배열(Array of Pointer)과 배열 포인터(Pointer to Array)는 비슷해 보입니다.
- 포인터 '배열'은 주소값들을 저장하는 '배열'입니다.
- 배열 '포인터'는 배열의 시작주소값을 저장할 수 있는 '포인터'입니다.