C

[C언어] 배열과 포인터의 관계

연화 2025. 3. 26. 09:00

 

C언어를 배우다 보면 배열과 포인터가 비슷한 것처럼 느껴질 때가 많습니다.
실제로 이 둘은 밀접한 관련이 있지만, 동일한 개념은 아닙니다. 오늘은 그 차이와 관계를 정리해볼게요.

 

📌 배열이란?

배열은 같은 자료형의 변수들을 연속된 메모리 공간에 저장하는 자료구조입니다.

int arr[5] = {1, 2, 3, 4, 5};
  • arr[0]은 배열의 첫 번째 요소
  • 메모리는 연속적으로 배치됨
  • 배열 이름 arr은 배열의 **시작 주소(= 첫 요소의 주소)**를 나타냄

📌 포인터란?

포인터는 메모리 주소를 저장하는 변수입니다.

int a = 10;
int *p = &a;
  • p는 변수 a의 주소를 가짐
  • *p는 p가 가리키는 주소에 있는 값을 의미함 (즉, a)

📌 배열과 포인터는 어떻게 연결되어 있을까?

int arr[3] = {10, 20, 30};
int *p = arr;
  • arr == &arr[0]: 배열 이름은 첫 번째 요소의 주소를 의미함
  • 따라서 p = arr;은 p = &arr[0];과 같음
  • 배열처럼 p[1] 또는 *(p + 1)도 사용 가능
printf("%d\n", arr[1]); // 20
printf("%d\n", *(p + 1)); // 20

👉 arr[i] == *(arr + i)
👉 p[i] == *(p + i)


📌 배열과 포인터의 차이점


구분 배열 포인터
메모리 고정된 크기 동적으로 할당 가능
수정 가능성 배열 이름은 주소 고정 포인터는 다른 주소 저장 가능
할당 방식 컴파일 시 할당 런타임에 동적 할당 가능 (malloc)
int arr[5];
int *p;

p = arr;    // 가능
// arr = p; // 불가능! 배열 이름은 상수 포인터이기 때문

📌 배열 순회: 포인터 vs 인덱스

for (int i = 0; i < 5; i++) {
    printf("%d ", arr[i]);        // 배열 인덱스 방식
    printf("%d ", *(arr + i));    // 포인터 방식
}

👉 위 두 방식은 완전히 같은 결과를 출력합니다. 포인터 방식이 더 빠르다고 알려져 있지만, 현대 컴파일러는 거의 차이를 없앨 정도로 최적화합니다.


📌 문자열과 배열의 포인터

char str[] = "Hello";
char *p = str;

printf("%c\n", *p);     // H
printf("%c\n", *(p+1)); // e

문자열도 문자 배열이고, 첫 문자의 주소를 포인터로 받아서 사용합니다.


📌 실전 예제: 함수에 배열 넘기기

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", *(arr + i));
    }
}

int main() {
    int nums[5] = {1, 2, 3, 4, 5};
    printArray(nums, 5);
    return 0;
}

👉 배열 이름 nums는 곧 첫 번째 요소의 주소이고, int *arr로 받아 사용할 수 있습니다.


✅ 정리하며

  • 배열과 포인터는 비슷하지만 다릅니다
  • 배열 이름은 변하지 않는 주소값이고, 포인터는 자유롭게 주소를 바꿀 수 있는 변수입니다
  • 배열을 포인터로 다룰 수 있지만, 반대로는 항상 가능하지 않습니다
  • 포인터 방식은 함수 인자 전달, 메모리 절약 등에서 자주 사용됩니다

 

배열과 포인터는 C언어의 핵심 개념이며, 혼동하기 쉽지만 명확한 차이점이 존재합니다. 특히 함수 전달, 메모리 조작, 동적 할당 등을 다룰 때 이 두 개념을 제대로 이해하고 있어야 에러 없는 효율적인 코드를 작성할 수 있습니다.

 

👀 C언어 관련 포스팅을 더 보고 싶다면 아래의 포스팅을 추천드려요

 

[C언어] 포인터(Pointer) - 정보처리기사 실기 준비

정보처리기사 실기 준비하면서 C언어의 개념을 간단하게 잡기 위해 공부하고 있는데요. 자료구조나 연산자 등은 자바와 비슷한 맥락이기 때문에 저는 바로 포인터 개념부터 시작했습니다.C언어

dev-yeonwha.tistory.com