了解在将数组传递给没有大小的函数时丢失的信息

Understanding the information lost while passing array to a function without its size

本文关键字:函数 信息 数组 了解      更新时间:2023-10-16

可能重复:
查找int数组的大小

我很好奇为什么在这个简单的C++代码中会出现以下行为。

在这篇文章中,我试图在两个不同的地方计算浮点数组的大小:

#include <iostream>
#include <iomanip>
using namespace std; 
void foo(float a[])
{
 int size = sizeof(a) / sizeof(float) ;
 cout << size <<std::endl;   
}

int main(int argc, char *argv[])
{
  float a[] = {22.2, 44.4, 66.6} ;
  int size = sizeof(a) / sizeof(float) ;
  cout << size <<std::endl;   
  foo(a);
  return 0;
}

使用gcc编译器,我得到的输出

~: ./a.out
3
2
~: 

对于其他数组大小,我得到的第一个条目是正确的大小,但第二个总是2,

现在,在我的代码中,如果我使用数组,并且我通常使用std::vectors,那么我永远不会传递没有大小的数组。但我很好奇这里发生了什么。

"a"在传递给函数时丢失了哪些信息?

(a)计算的第二个大小是多少?

第二个sizeof()正在计算:sizeof(float*) / sizeof(float)。函数foo的参数只是指向数组的第一个成员的指针,它与float*类似(EDIT:相同)。因此,sizeof(array)将为您提供指向第一个成员的指针的大小,无论数组是int[]、float[]还是char[]。

在这里测试后,您可以看到第二个结果是1。我怀疑(不完全确定)你的foo参数有指针衰减,所以它计算sizeof(float*),而不仅仅是float