민혁이의 IT스토리

포인터 배열& 배열 포인터 본문

C언어

포인터 배열& 배열 포인터

FE_Minhyuk 2025. 10. 9. 00:07

 

제목에서 느꼈듯 C를 공부하다가 이상한 놈들을 만났다
이름만 봐도 그렇듯
'포인터 배열’‘배열 포인터’ 때문에 헷갈리기 쉽다고 느꼈다
나도 한참 혼동했지만, 정리하면서 이해한 과정을 공유하려고 한다.

 

 


포인터 배열


 

정의: 포인터 여러 개를 모아둔 배열

설명: int형 포인터 4개를 담는 배열이라면, 각 원소는 int 하나를 가리키는 포인터이다.

#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30;
    int *arr[3] = { &a, &b, &c }; // 포인터 배열

    printf("%d\n", *arr[0]); // 10
    printf("%d\n", *arr[1]); // 20
    printf("%d\n", *arr[2]); // 30
}

 

- 그림으로 이해

arr[0] → &a → 10
arr[1] → &b → 20
arr[2] → &c → 30

 

 

단순히 말해서, 변수의 주소값이 모여있는 배열을 만들었다고 생각하면 이해가 쉬워진다.

 

  • arr은 포인터 3개를 담은 배열이고,
  • *arr[i]로 실제 값에 접근할 수 있습니다.

 


배열 포인터


 

정의: 배열 한 덩어리를 가리키는 포인터

설명: int형 4개짜리 배열을 가리키는 포인터입니다.

 

 

#include <stdio.h>

int main() {
    int arr[2][4] = { {1,2,3,4}, {5,6,7,8} };
    int (*p)[4] = arr; // 배열 포인터

    printf("%d\n", (*p)[0]); // 1
    printf("%d\n", (*p)[1]); // 2

    p++; // 다음 행으로 이동
    printf("%d\n", (*p)[0]); // 5
}

- 그림으로 이해

p → arr[0] → {1,2,3,4}
p+1 → arr[1] → {5,6,7,8}

 

 

간단히 설명하면, "하나의 배열을 포인터에 담는다"라고 생각해라

 

추가 설명 : 

배열은 0번째 인덱스 주소에서 부터 순서대로 연결되어 있다. 따라서 2차원배열도 주소로 접근을 하게 되면 
arr[1][2]가 아닌 (*p)[4] = 5 이렇게 접근을 할 수 있게 된다. 

 

 


차이점 비교


 

 

구분 선언 의미 접근 방법
포인터 배열 int *p[3] 포인터 여러 개 *p[0], *p[1]
배열 포인터 int (*p)[3] 배열 한 줄 (*p)[0], (*p)[1]

 

 

 

 


내가 이해한 헷갈림 포인트


 

  • 괄호 () 위치의 중요성
  • *p는 “배열 한 덩어리 전체”
  • p++ 의미
    • 포인터 배열 → 다음 포인터로 이동
    • 배열 포인터 → 다음 배열 한 줄로 이동
  • 배열 포인터는 int (*)[N] 타입이므로 단일 포인터(int *)와 다름

 

 


마무리


 

처음에는 그냥 말장난 하는줄 알았는데 이해하니까 
완전히 다르다는걸 깨달았고 C언어에 대한 이해도가 한층도 높아진 것 같아
뿌듯하다. 

 

'C언어' 카테고리의 다른 글

동적 메모리 할당  (0) 2025.10.10