C++ 为什么sizeof函数在这里不能正常工作

C++ 为什么sizeof函数在这里不能正常工作,c++,arrays,reference,parameter-passing,C++,Arrays,Reference,Parameter Passing,我只是在玩弄一些代码,然后我突然发现,通过引用传递数组后,sizeofarr/sizeofarr[0]给了我超出预期的其他输出。如果我只是传递引用,那么len=1可能是合理的,因为sizeofarr[0]/sizeofarr[0]。这有什么问题吗?我缺少了什么概念 #include<iostream> using namespace std; void display(int *arr) { int len=sizeof(arr)/sizeof(arr[0]); c

我只是在玩弄一些代码,然后我突然发现,通过引用传递数组后,sizeofarr/sizeofarr[0]给了我超出预期的其他输出。如果我只是传递引用,那么len=1可能是合理的,因为sizeofarr[0]/sizeofarr[0]。这有什么问题吗?我缺少了什么概念

#include<iostream>
using namespace std;

void display(int *arr)
{
    int len=sizeof(arr)/sizeof(arr[0]);
    cout<<len<<"\n";
    for(int i=0;i<50;++i)
    {
        cout<<arr[i];
    }
    cout<<"\n";
}

int main()
{
    int arr[50]={0};
    for(int i=0;i<50;++i)
    {
        arr[i]=i;
    }
    display(arr);
    return 0;
}

为什么lenth的输出不是应该的50?为什么只有2而不是50。

每当您尝试将数组传递给任何函数时。数组隐式转换为指向数组第一个元素的指针。在上面的代码中,当您传递整数数组时,它将被转换为 指向数组的整数指针。 这就是为什么你会得到这样的结果。在数组情况下,需要在函数中显式传递大小。所以sizeof工作正常,它正在分裂 指向一个元素大小的数组的指针的大小


这种转换背后的原因是,您必须知道,参数被复制到函数的参数中。但在数组的情况下,数组的大小可以是可变的,它们的大小可能更大。所以不需要复制这么大的数组。这就是为什么语言会自动实现这种转换

arr是指针sizeof指针的大小是4到8字节,具体取决于编译目标。请缩进您的代码首先,sizeof是运算符,而不是函数。其次,指针的大小是指针本身的大小,而不是它可能指向的对象。要解决问题,有三种可能的解决方案:要么将大小作为参数传递给函数;或者使用模板推断将引用传递给数组的大小;或者改用std::vector或std::array。sizeof是运算符,而不是函数。你看到的行为是正确的。在display中,参数arr是指针,sizeofar计算指针的大小,而不是它指向的数组。sizeofarr/sizeofarr[0]技术仅在arr是数组时有效。将数组传递给函数,将数组转换为指针,因此函数接收的是指针而不是数组。我已经稍微改写了你的答案,我猜英语不是你的母语。如果您不喜欢此更改,请随时恢复。请注意,arr是指向整数的int*指针。它指向数组的第一个元素。它与指向几乎从未使用过的数组的指针不同。公平地说,它指向一个数组,但它的类型不是指向数组的指针。指向数组的指针不会出现如下所述的问题: