EP.3-2 포인터와 배열
Phase 3: Memory & Address Control
EP.3-2 포인터와 배열 — 이름표 뒤에 숨겨진 비밀
배열의 이름은 사실 "기관차의 위치"를 가리키는 리모컨이었습니다.
배열 이름의 정체: 고정 주소값
우리가 int scores[3]이라고 선언할 때, scores라는 이름 자체는 배열의 첫 번째 칸(scores[0])의 주소를 의미합니다. 전 장에서 배운 포인터와 똑같이 동작하죠. 다만, 배열 이름은 위치를 바꿀 수 없는 '고정 리모컨'이라는 점이 다릅니다.
포인터에 1을 더하면 주소값이 단순히 1 늘어날까요? 아닙니다. 컴퓨터는 데이터의 타입(int, char 등)을 보고 다음 칸이 있는 곳으로 자동 점프합니다.
- char* + 1: 1바이트 점프
- int* + 1: 4바이트 점프
실습: 주소 테스터기로 배열 칸별 주소 확인
#include <stdio.h>
int main() {
int train[3] = {10, 20, 30};
int *ptr = train; // 배열 이름은 주소이므로 &를 붙이지 않습니다.
printf("=== [배열 단자대 점검] ===\n");
for (int i = 0; i < 3; i++) {
// (ptr + i)는 i번째 칸의 '위치'를, *(ptr + i)는 그 '값'을 의미합니다.
printf("%d번 칸: 값=%d, 주소=%p\n", i, *(ptr + i), (void*)(ptr + i));
}
*(ptr + 1) = 999; // 리모컨으로 두 번째 칸을 원격 수정!
printf("\n수정 후 train[1]: %d\n", train[1]);
return 0;
}
int main() {
int train[3] = {10, 20, 30};
int *ptr = train; // 배열 이름은 주소이므로 &를 붙이지 않습니다.
printf("=== [배열 단자대 점검] ===\n");
for (int i = 0; i < 3; i++) {
// (ptr + i)는 i번째 칸의 '위치'를, *(ptr + i)는 그 '값'을 의미합니다.
printf("%d번 칸: 값=%d, 주소=%p\n", i, *(ptr + i), (void*)(ptr + i));
}
*(ptr + 1) = 999; // 리모컨으로 두 번째 칸을 원격 수정!
printf("\n수정 후 train[1]: %d\n", train[1]);
return 0;
}
우리가 흔히 쓰는 train[i]라는 표현은 사실 컴퓨터 내부에서 *(train + i)로 번역됩니다. 즉, 모든 배열 제어의 뿌리는 포인터 연산에 있습니다. 타입을 정확히 배선해야 자동 점프가 오차 없이 수행된다는 점을 명심하십시오.

댓글
댓글 쓰기