我可以声明animal_array1
和animal_array2
。堆栈中的第一个,而第二个是......好吧,仍然在堆栈上,但这次被声明为函数参数。以下是示例代码:
#include <iostream>
using namespace std;
struct Animal
{
};
void test(Animal animal_array2[10])
{
Animal animal_array1[10];
if(sizeof(animal_array2) == sizeof(animal_array1))
cout << "Both sizes are equal. That's expected!" << endl;
else
cout << "Mhhh sizes are *NOT* equal. That wasn't expected at all!" << endl;
}
int main()
{
Animal unused_var[10];
test(unused_var);
}
输出结果为:
$./a.out
Mhhh sizes are *NOT* equal. That wasn't expected at all!
怎么可能? Gcc bug?或者它是标准行为?我们怎样才能从相同的表观类型得到这样的拉伸结果?
答案 0 :(得分:4)
数组是C和C ++中唯一不能通过值传递的数据类型。因此,数组衰减为指向数组的第一个元素的指针(当声明并传递时)作为函数参数。
基本上就是这样:
void test(Animal animal_array2[10])
实际上是:
void test(Animal *animal_array2)
但仅作为功能参数
并将数组作为参数传递:
test(unused_var);
衰减到指向数组中第一个元素的指针:
test(&(unused_var[0]));
(作为旁注:但没有实际解除引用)
答案 1 :(得分:3)
当传递给C ++中的函数时,数组会衰减为指针。通常,您所做的是将已知大小作为单独的参数传递给函数。不在方括号之间。