假设我有一个功能
void function(double p[2]) {
cout << p[0] << " " << p[1] << endl;
}
如果我尝试以下代码
double a[1] = {1};
double b[2] = {2, 3};
double c[3] = {4, 5, 6};
function(a);
function(b);
function(c);
我得到像
这样的东西1 2.0778e-317
2 3
4 5
换句话说,2
似乎完全被忽略了,所有3个数组都被传递给了函数。
以下是完全一样的吗?
void function(double p[2])
void function(double p[])
void function(double *p)
如果是,是否有办法制作一个只接受特定长度或至少特定长度的数组的函数?我问的原因是a
,b
和c
的类型似乎不同。 (例如,typeid(a).name()
和typeid(b).name()
会得到不同的结果。
答案 0 :(得分:4)
他们是一样的。数组函数参数调整到指针。所有与数组长度有关的信息都将丢失。
如果您尝试定义这三个函数,则会出现多个定义错误:
void function(double p[2]) {} // defines void function(double*)
void function(double p[]) {} // ERROR
void function(double *p) {} // ERROR
该语言的这一令人困惑的特征继承自C。
要强制某个函数只接受某种类型的数组参数,可以使用对数组的引用:
void function(const double(&p)[2]);
请注意,参数调整与数组 decay 不同。当您使用数组的名称作为参数调用function
时,或者只是将数组指定给指针时,会发生数组衰减。
double a[42] = {};
function(a); // a decays to double*
double * b = a; // a decays to double*