배열 포인터와 일반 포인터 사이에는 여전히 차이가 있습니다. 결국 배열을 정의할 때 해당 요소 유형과 개수를 결정할 수 있습니다.
컴파일러가 배열인지 일반 포인터인지 유추할 수 없는 경우에만 일반 포인터의 크기를 기준으로 계산합니다. sizeof 예를 들어 함수 선언에서 void f(int* a)은 모든 포인터는 a Enter 매개변수로 전달될 수 있습니다. 컴파일러가 배열인지 여부를 추론하는 것은 불가능합니다 . 따라서 sizeof(a) = sizeof(int*)
그러나 귀하의 질문의 경우 컴파일러는 a이 5요소 정수 배열임을 명확하게 추론할 수 있으므로 sizeof(a) = sizeof(int[5])
간단히 말하면 본질적인 차이점은 다음과 같습니다. 변수 이름은 메모리 영역의 이름이며 런타임에는 이름이 없습니다. a와 p는 소스 코드와 컴파일 시간에만 의미가 있습니다. a라는 메모리는 5개의 정수를 포함하는 int[5] 유형의 메모리 조각입니다. p는 int 유형의 int 포인터가 하나만 있는 메모리 공간으로 명명됩니다. a[2]는 컴파일 중에 해당 메모리 공간의 세 번째 단위로 직접 변환됩니다. p[2]는 p로 변환되고 int* 메모리 공간의 값을 꺼내고 2를 추가하여 메모리 공간의 메모리 주소를 가져옵니다. int const p는 p가 가리키는 메모리 공간을 불변의 int 포인터 하나만 갖도록 제한합니다.
배열과 포인터는 두 가지 유형이 있습니다.
배열 이름은 암시적으로 첫 번째 요소에 대한 포인터로 변환될 수 있습니다.
a
의 유형은int[5]
이고,sizeof(a)
은sizeof(int[5])
대신sizeof(int *)
과 동일합니다.배열 포인터와 일반 포인터 사이에는 여전히 차이가 있습니다. 결국 배열을 정의할 때 해당 요소 유형과 개수를 결정할 수 있습니다.
컴파일러가 배열인지 일반 포인터인지 유추할 수 없는 경우에만 일반 포인터의 크기를 기준으로 계산합니다.
sizeof
예를 들어 함수 선언에서
void f(int* a)
은 모든 포인터는a
Enter 매개변수로 전달될 수 있습니다. 컴파일러가 배열인지 여부를 추론하는 것은 불가능합니다. 따라서
sizeof(a) = sizeof(int*)
그러나 귀하의 질문의 경우 컴파일러는
a
이 5요소 정수 배열임을 명확하게 추론할 수 있으므로sizeof(a) = sizeof(int[5])
간단히 말하면 본질적인 차이점은 다음과 같습니다.
변수 이름은 메모리 영역의 이름이며 런타임에는 이름이 없습니다. a와 p는 소스 코드와 컴파일 시간에만 의미가 있습니다.
a라는 메모리는 5개의 정수를 포함하는 int[5] 유형의 메모리 조각입니다.
p는 int 유형의 int 포인터가 하나만 있는 메모리 공간으로 명명됩니다.
a[2]는 컴파일 중에 해당 메모리 공간의 세 번째 단위로 직접 변환됩니다.
p[2]는 p로 변환되고 int* 메모리 공간의 값을 꺼내고 2를 추가하여 메모리 공간의 메모리 주소를 가져옵니다.
int const p는 p가 가리키는 메모리 공간을 불변의 int 포인터 하나만 갖도록 제한합니다.