배열 이름은 배열의 시작 주소를 가리키지만, 포인터와는 엄연히 다른 존재다.
배열은 고정된 메모리 공간을 나타내고, 포인터는 주소를 담는 변수다.
배열과 포인터 비교 예시
#include <stdio.h>
int main() {
int arr[3] = {1, 2, 3};
int *p = arr;
// 1. 크기 차이
printf("sizeof(arr): %zu\n", sizeof(arr)); // 배열 전체 크기 (12 bytes)
printf("sizeof(p): %zu\n", sizeof(p)); // 포인터 변수 크기 (8 bytes)
// 2. 주소값 변경 가능 여부
p++; // 가능
// arr++; // 컴파일 에러! 배열 이름은 상수 형태의 주소
// 3. 인덱스 접근의 동일성
printf("arr[1]: %d, p[1]: %d\n", arr[1], p[1]);
printf("*(arr+1): %d, *(p+1): %d\n", *(arr+1), *(p+1));
return 0;
}
코드 설명:
– sizeof 연산 시 배열은 배열 전체의 크기를, 포인터는 주소값을 저장하는 변수 자체의 크기를 반환한다.
– 배열 이름은 배열의 시작 주소를 나타내는 상수이므로 값을 변경할 수 없지만, 포인터는 변수이므로 다른 주소를 가리키도록 변경할 수 “있다.
오늘 공부 기록의 중심은 C언어 배열과 포인터 차이였다.
주소값 출력을 직접 찍어 보니 처음 가정을 의심해 보니 정의는 외웠는데 조건이 바뀌는 순간 판단이 흔들렸다.
배열과 부분은 따로 떼서 다시 읽었다.
이론 문장보다 내 코드에서 어떤 순간에 실패하는지가 훨씬 오래 남았다.
디버거를 켜고 한 단계씩 내려가니 추상적으로 보이던 흐름이 숫자로 보였다.
오늘 정리는 길지 않았지만 밀도는 높았다.
C언어 배열과 포인터 차이은 내일 한 번 더 확인해 볼 생각인 것 같다.