2

可能重复:在 C 编程语言中
计算数组的大小Sizeof 一个数组?

为什么sizeof(arr)/(double)sizeof(arr[0])工作和sizeof(arr+0)/(double)sizeof(arr[0])不工作?

为什么sizeof(arr)/(double)sizeof(arr[0])将 arr 传递给函数时也不起作用?这是完整的代码示例:

#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;
}

输出 5 1 1

4

4 回答 4

4

发生这种情况是因为数组在传递给将指针作为参数的函数时会衰减为指针。

在你main的内部,

int arr[] = {1,2,3,4,5};

声明相当于

int arr[5] = {1,2,3,4,5};

因为编译器有足够的信息来计算5聚合初始值设定项。然而,在函数头中,int arr[]并不意味着同样的事情:它周围没有上下文告诉编译器它只是一个指向整数的指针。

于 2012-07-07T15:35:15.937 回答
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,因此与计算结果为 5sizeof(arr)/(double)sizeof(arr[0])的相同。sizeof(int[5]) / (double)sizeof(int)

接下来,sizeof(arr+2)/(double)sizeof(arr[0])再次与 相同sizeof(int*) / (double)sizeof(int),因为表达式的类型arr+2int*

于 2012-07-07T15:41:25.487 回答
0

为什么 sizeof(arr)/(double)sizeof(arr[0]) 有效

因为sizeof(arr)以字节为单位返回整个数组的大小(假设 20int是 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;
}
于 2012-07-07T15:45:41.223 回答
0

在 main 内部,arr 的类型为“五个整数的数组”,但 arr+0 的类型为“指向 int 的指针”。当您将零添加到 arr 时,您将其视为指针,并且一旦您将数组用作指针,它就会转换为指针。

于 2012-07-07T15:39:13.757 回答