有关数组类型的问题

时间:2015-10-25 17:16:14

标签: c++ arrays

假设我有一个功能

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)

如果是,是否有办法制作一个只接受特定长度或至少特定长度的数组的函数?我问的原因是abc的类型似乎不同。 (例如,typeid(a).name()typeid(b).name()会得到不同的结果。

1 个答案:

答案 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*