Sizeof 数组作为函数的参数传递

Sizeof array passed as parameter of function

让我们考虑以下代码:

#include <iostream>
using namespace std;

void foo(int * arr)
{
    cout << sizeof(arr) << endl;
}

int main()
{
    int arr[3] = {1, 2, 3};
    cout << sizeof(arr) << endl;
    foo(arr);
}

由于数组名称衰减为指向其第一个元素的指针,为什么 sizeof(arr)foo() 中 returns 是 8 而不是 4?

在大多数情况下,指针的大小为 8 个字节。在您的系统中,这是指针的大小。

请注意,您可能知道,指针的大小不是它指向的对象的大小或对象类型的大小。

指针的大小取决于几个因素,例如CPU体系结构、编译器或操作系统。

通常的做法是如果系统是16位,大小指针大小是2字节,如果系统是32位,大小是4字节,如果是64位,大小是8字节。

您传递给函数的参数是数组第一个元素的地址。这意味着在函数中您只能看到您在 main 范围内声明的数组的地址。 如果你想像在 main 函数中一样对待数组,你应该将它的大小也作为参数传递给函数。如果您的数组始终具有固定大小,那么您不必这样做。 我想补充一点,sizeof(arr) 永远不会 return 与主作用域相同的值。

函数内部sizeof(arr)的结果就是sizeof(int*)的结果

当你将一个数组赋值给一个指针,并对指针使用sizeof运算符时,sizeof将return指针(不是数组)的大小。所以在 foo 函数中,sizeof return int * 字节大小。

此外,您可以使用 array 代替内置数组。 array 知道它的大小,但内置数组不会。

注意:字体大小取决于平台。