프로그래밍언어/C언어[초급]

[C언어][초급] Chapter52. 포인터와 배열 – 배열의 시작 주소와 포인터의 관계

about_IT 2025. 4. 19. 07:30

포인터와 배열은 C언어에서 서로 밀접한 관계가 있습니다.
사실 배열의 이름 자체가 곧 포인터처럼 동작하기 때문입니다.

이번 글에서는 배열과 포인터가 어떻게 연결되어 있는지를 설명하고, 직접 다뤄보는 예제를 통해 이해해보겠습니다.


● 배열 이름은 첫 번째 요소의 주소

int arr[5] = {1, 2, 3, 4, 5};
printf("%p\n", arr);        // 배열의 시작 주소
printf("%p\n", &arr[0]);    // arr[0]의 주소

두 출력 결과는 동일합니다. 배열 이름은 첫 번째 요소의 주소와 같습니다.


● 배열과 포인터의 관계

int *p = arr;

이 코드는 arr[0]의 주소를 포인터 p에 저장하는 것과 동일합니다.
즉, p는 arr을 순회할 수 있게 됩니다.


● 포인터로 배열 요소 접근

for (int i = 0; i < 5; i++) {
    printf("%d ", *(p + i));
}

배열처럼 인덱스로 접근하지 않고, 포인터 연산으로도 배열 요소를 가져올 수 있습니다.


● 배열을 함수에 넘길 때

void printArray(int *a) {
    printf("%d\n", a[0]);
}

배열을 함수 인자로 넘기면 포인터처럼 처리됩니다.


● 요약

  • 배열 이름은 배열의 시작 주소를 의미합니다.
  • 포인터는 배열처럼 사용할 수 있습니다.
  • 배열과 포인터는 서로 변환될 수 있지만 완전히 같은 것은 아닙니다.

포인터와 배열의 관계를 이해하면 메모리 구조와 데이터 흐름을 더 잘 파악할 수 있습니다.
배열을 포인터처럼, 포인터를 배열처럼 사용하는 연습을 통해 감을 익혀보세요.


● 실습 문제

문제 1

배열 arr[5] = {10, 20, 30, 40, 50}의 첫 번째 요소 주소를 출력하세요.

 

문제 2

포인터 p를 이용해 배열의 두 번째 요소를 출력하는 코드를 작성하세요.

 

문제 3

arr[3]을 포인터 연산으로 접근하려면 어떻게 해야 하나요?

 

문제 4

배열을 함수에 넘기면 왜 포인터처럼 처리되나요?

 

문제 5

포인터와 배열이 다른 점을 간단히 설명하세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

▶ 정답 확인하기

정답 1

int arr[5] = {10, 20, 30, 40, 50};
printf("%p\n", arr);

 

정답 2

int *p = arr;
printf("%d\n", *(p + 1));

 

정답 3

*(arr + 3)

 

정답 4

함수에 배열을 넘기면 배열 전체가 아니라 첫 번째 요소의 주소가 전달되므로 포인터처럼 작동합니다.

 

정답 5

배열은 고정된 크기의 메모리 공간이고, 포인터는 어떤 주소든 가리킬 수 있습니다.