据说,当数组作为参数传递给函数时,它会衰减为指针,并且数组的长度也需要作为参数传递。这意味着原始数组存储了有关其大小的信息。 事实上,函数体内的
sizeof(arr)
(其中 arr
是函数的参数)应该返回 8
(字节),因为这是 64 位机器中指针的大小。同时sizeof(arr)
,当arr
不是参数时,返回整个数组的实际大小(以字节为单位)。
#include <iostream>
void foo(int arr[]) {
// prints 8
std::cout << sizeof(arr) << "\n";
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
// prints 20
std::cout << sizeof(arr) << "\n";
// prints 8
foo(arr);
}
但是数组的名称已经是指向其第一个元素的指针。
arr[i]
只是*(arr + i)
。这就导致了一个矛盾。要么:
这就导致了矛盾。
不,不是。 在某些情况下,数组会衰减为指向其第一个元素的指针。例如,数组 不 衰减为指针的一种情况是
decltype
:
int arr[2];
decltype(arr) i; //i is int[2] and array does not decay to a pointer here