可能重复:
Calculating size of an array
Sizeof an array in the C programming language?
为什么sizeof(arr)/(double)sizeof(arr[0])
有效且sizeof(arr+0)/(double)sizeof(arr[0])
不起作用?
当arr传递给函数时,为什么sizeof(arr)/(double)sizeof(arr[0])
也不起作用?以下是完整的代码示例:
#include <iostream>
using namespace std;
int givesize(int arr[])
{
cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}
int main()
{
int arr[] = {1,2,3,4,5};
cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
cout<<sizeof(arr+2)/(double)sizeof(arr[0])<<"\n";
givesize(arr);
return 0;
}
输出 五 1 1
答案 0 :(得分:4)
这是因为arrays decay to pointers将它们传递给以指针作为参数的函数。
在main
内,
int arr[] = {1,2,3,4,5};
声明等同于
int arr[5] = {1,2,3,4,5};
因为编译器有足够的信息来计算聚合初始值设定项中的5
。但是,在函数头中,int arr[]
并不意味着同样的事情:它周围没有上下文来告诉编译器它只是指向整数的指针。
答案 1 :(得分:2)
int arr[]
与int* arr
相同。这意味着:
int givesize(int arr[])
{
cout<<sizeof(arr)/(double)sizeof(arr[0])<<"\n";
}
sizeof(arr)/(double)sizeof(arr[0])
实际上是sizeof(int*) / (double)sizeof(int)
。因为它输出1
,暗示一个32位平台。
int arr[]
作为局部变量与int* arr
不同,因此sizeof(arr)/(double)sizeof(arr[0])
与评估为5的sizeof(int[5]) / (double)sizeof(int)
相同。
接下来,sizeof(arr+2)/(double)sizeof(arr[0])
再次与sizeof(int*) / (double)sizeof(int)
相同,因为表达式arr+2
的类型为int*
。
答案 2 :(得分:0)
在main中,arr的类型为“五个整数的数组”,但是arr + 0的类型为“指向int的指针”。当您向arr添加零时,您将其视为指针,并且只要您像指针一样使用数组,它就会转换为指针。
答案 3 :(得分:0)
为什么sizeof(arr)/(double)sizeof(arr [0])有效
因为sizeof(arr)
以字节为单位返回整个数组的大小(假设{20}假设int
是32位),并且sizeof(arr[0])
返回第一个int的大小(即4字节)。这将给我们5。
为什么当arr传递给函数时,sizeof(arr)/(double)sizeof(arr [0])也不起作用?
因为数组衰变为指针。这意味着他们失去了一条重要的信息:它们的大小。我们不能仅通过指针直接计算数组的大小。该函数怎么会知道它是一个数组开始?
C ++?使用模板功能:
template <typename T, int N>
int getsize(const T (&arr)[N])
{
return N;
}