运营商退货冲突的大小

时间:2012-02-18 06:42:21

标签: c++ c size

这是一些代码

class DengkleTryingToSleep{
public:
int minDucks(int ducks[]);
int temp(int ducks[]){
int size=sizeof(ducks);
cout<<"sizeof="<<size<<"\n";
}
};


int main (int argc, const char * argv[])
{
DengkleTryingToSleep dt;
int arr[]={9,3,6,4};

cout<<"sizeof "<<sizeof(arr);
cout<<"\nsizeof from function "<<dt.temp(arr);

return 0; 
}

并输出

sizeof 16
sizeof from function sizeof=8

并且我不知道这是如何工作的,因为它返回16(正如在main中调用时所预期的那样) 从函数

调用时返回8

2 个答案:

答案 0 :(得分:5)

因为数组在传递给函数时会衰减为指针。你得到了temp函数中指针的大小。

如果您需要知道函数中数组的长度......您也必须将其传递给它。

答案 1 :(得分:3)

实际上这个功能:

int temp(int ducks[])

完全等同于此功能:

int temp(int *ducks)

根本没有差异。没有不同。所以无论你传递什么,无论是数组还是指针,它都将成为函数内部的指针。

这意味着,当您在函数中编写sizeof(ducks)时,它完全等同于sizeof(int*),它会在您的计算机上返回8(我猜,您的计算机具有64位操作系统)其中指针的大小为8字节)。

如果你想传递一个数组,并且它不会衰减成指针类型,那么这样做:

template<size_t N>
int temp(int (&ducks)[N])
{
    int size=sizeof(ducks);
    cout<<"sizeof="<<size<<"\n";
}

现在它将打印16。请注意,函数N内部表示数组中的项目数。因此,在您的情况下,它将是4,因为数组中有4个元素。这意味着,如果您需要数组的长度,则无需将其计算为sizeof(bucks)/sizeof(int),因为您已经知道数组的长度为N

另请注意,此方法存在限制:现在您无法传递动态分配的数组:

int *a = new int[10];
dt.temp(a); //compilation error

//but you can pass any statically declared array
int b[100], c[200];
dt.temp(b); //ok - N becomes 100
dt.temp(c); //ok - N becomes 200

但是在C ++中,你有一个更好的选择:使用std::vector<int>

int temp(std::vector<int> & ducks)
{
     std::cout << ducks.size() << std::endl;
}

//call it as
std::vector<int> v = {1,2,3,4,5,6}; //C++11 only, or else : use .push_back()
dt.temp(v);