为什么sizeof statsements产生不同的结果?

时间:2012-07-07 15:33:32

标签: c++

  

可能重复:
  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

4 个答案:

答案 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;
}