这是一些代码
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答案 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);