为什么统计的大小会产生不同的结果

Why do sizeof statsements produce different results?

本文关键字:结果 统计 为什么      更新时间:2023-10-16

可能的重复项:
计算数组
的大小 C 编程语言中数组的大小?

为什么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;
}

输出511

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

在你的main内,

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

声明等效于

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

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

函数

参数列表中的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*

在 main 内部,arr 的类型是"五个整数的数组",但 arr+0 的类型是"指向 int 的指针"。 当你在arr中添加零时,你把它当作一个指针,一旦你像指针一样使用数组,它就会被转换为指针。

为什么 sizeof(arr)

/(double)sizeof(arr[0]) 有效

因为 sizeof(arr) 返回整个数组的大小(以字节为单位)(假设 int 是 32 位,假设 20),而 sizeof(arr[0]) 返回第一个整数的大小(即 4 个字节)。这将给我们 5。

为什么当arr传递给函数时sizeof(arr)

/(double)sizeof(arr[0])也不起作用?

因为数组衰减为指针。这意味着它们会丢失一条重要的信息:它们的大小。我们不能仅通过指针直接计算数组的大小。该函数如何知道它是一个数组?


C++?使用模板函数:

template <typename T, int N>
int getsize(const T (&arr)[N])
{
    return N;
}