1. a[b]의 의미
int arr[] = {1, 2, 3};
printf("%d", arr[3]);
C언어에서는 이런 코드를 작성해도 index out of range error가 따로 발생하지 않는다.
이런 현상이 발생하는 이유는 C언어에서 a[b]가 *(a+b) 연산에 대한 proxy이기 때문이다.
(물론, 선언부에서의 a[b]는 변수 a가 크기 b인 배열임을 의미한다.)
이 사실은 다음 코드에서 확인할 수 있다.
int arr[3] = {1, 2, 3};
printf("%d\n", arr[2]);
printf("%d\n", *(arr+2));
printf("%d\n", 2[arr]);
printf("%d\n", *(2+arr));
int *p = arr;
printf("%d\n", p[2]);
printf("%d\n", *(p+2));
printf("%d\n", 2[p]);
printf("%d\n", *(2+p));

참고로, p+2 는 p로부터 2 byte 뒤의 주소가 아니라 p로부터 2×sizeof(int) byte 뒤의 주소를 의미한다.
2. arr 의 의미
arr은 대부분의 경우 arr[0]의 주소로 해석된다. 즉, 배열이 차지하는 메모리 영역의 첫번째 byte 를 의미하게 된다.
int arr[3] = {1, 2, 3};
printf("%p\n", arr);
printf("%p\n", &arr[0]);

따라서, 우리는 배열과 포인터를 똑같은 방식으로 다룰 수 있다.
int arr[3] = {1, 2, 3};
int *p = arr;
printf("%p\n", arr);
printf("%p\n", p);

하지만 배열과 포인터 사이에는 몇 가지 차이가 있다.
몇 가지 경우 arr은 '배열 그 자체'를 의미하게 된다.
int arr[3] = {1, 2, 3};
int *p = arr;
printf("%i\n", sizeof(arr));
printf("%i\n", sizeof(p));

sizeof(arr) : 배열이 메모리에서 차지하는 byte 크기 ( sizeof(int) × 3 byte )
sizeof(p) : 변수 p가 메모리에서 차지하는 byte 크기 ( 64 bit = 8 byte )
int arr[] = {1, 2, 3};
int *p = arr;
printf("%p\n", &arr);
printf("%p\n", &p);
&arr : 배열의 주소 ( = arr = &arr[0] )
&p : 변수 p의 주소
참고로, arr은 변경이 불가능하다.
arr = &x, arr += 2, arr++ 다 안된다.
Reference
https://modoocode.com/231
씹어먹는 C 언어 시작하기
modoocode.com
'프로그래밍 언어 > C·C++' 카테고리의 다른 글
[C++] 2. Visual Studio 사용해보기 (0) | 2023.12.12 |
---|---|
[C++] 1. 왜 게임 업계에서는 C++을 쓰는 걸까? (0) | 2023.12.12 |
const and pointer (0) | 2022.06.25 |
선언이란? (feat. Array and Pointer) (0) | 2022.06.25 |
Command Line Arguments (0) | 2022.06.06 |