关于数组类型的问题

Questions on the type of an array

本文关键字:类型 问题 数组 于数组      更新时间:2023-10-16

假设我有一个函数

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, bc的类型似乎不一样。(例如,typeid(a).name()typeid(b).name()会得到不同的结果)。

它们是一样的。数组函数参数将调整为指针。所有与数组长度有关的信息都将丢失。

如果你试图定义这三个函数,你会得到多个定义错误:

void function(double p[2]) {} // defines void function(double*)
void function(double p[]) {}  // ERROR
void function(double *p) {}   // ERROR

这个令人困惑的语言特性继承自c。

要强制函数只接受特定类型的数组参数,可以使用对array的引用:

void function(const double(&p)[2]);

注意参数调整与数组衰减不同。数组衰减是当您以数组名称作为参数调用function时发生的,或者当您简单地将数组赋值给指针时发生的。

double a[42] = {};
function(a);    // a decays to double*
double * b = a; // a decays to double*