프로그래밍언어/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
배열은 고정된 크기의 메모리 공간이고, 포인터는 어떤 주소든 가리킬 수 있습니다.