double x[]
的语法是什么?
声明一个数组是一种C方式吗?
如果我有像
这样的功能void evaluate(double x[], double *f)
{
// evaluate
}
我可以传递任何长度的参数x吗?
答案 0 :(得分:5)
数组类型的参数与指针完全相同。您无法真正将数组作为函数参数传递。但是,这种语法给出了一种错觉,你可以为了便于阅读。所以你的功能相当于:
void evaluate(double *x, double *f)
{
// evaluate
}
来自ISO / IEC 14882:2011的§8.3.5/ 5:
在确定每个参数的类型后,任何类型为“T of T”或“函数返回T”的参数都将被调整为“指向T的指针”或“指向函数返回T的指针”。
表示数组的表达式将衰减为指向其第一个元素的指针,因此您仍然可以执行此操作:
void evaluate(double x[]);
int array[] = {1, 2, 3, 4, 5};
evaluate(array); // The array decays to a pointer to its first element
来自§4.2:
“N T数组”或“未知T的数组”类型的左值或右值可以转换为“指向T的指针”类型的prvalue。结果是指向数组的第一个元素的指针。
所以是的,你确实可以传递任何长度的数组。实际上,您只是将指针传递给第一个元素。但是,如果需要,您还需要传递数组的长度。
答案 1 :(得分:4)
数组可能令人困惑,因为在大多数情况下,数组的名称会衰减为指向其第一个元素的指针。所以:
double x[3]; // x is an array of 3 doubles
void f(double x[3]); // f takes a pointer to double
f(x); // calls f with the address of x[0]
将数组类型衰减为f
指针的原因是,您不必为每个数组大小都有单独的函数:
double x[3];
double y[4];
void f(double x[3], int size) {
for (int i = 0; i < size; ++i)
std::cout << x[i] << ' ';
std::cout << '\n';
}
f(x, 3);
f(y, 4);
如果参数为double*x
,double x[]
,double x[3]
,double x[17]
,double x[]
,则其工作方式相同;在所有这些情况下,x
都被视为double*
。
答案 2 :(得分:3)
在函数的参数列表中,double x[]
与double *x
相同。
我可以传递任何长度的参数x吗?
是的,你可以通过。但是无法知道函数x
中数组evaluate
的长度。所以你可能也希望传递长度。
答案 3 :(得分:2)
由于数组会立即衰减为指针,因此数组实际上永远不会传递给函数。您可以假装函数接收数组作为参数,并通过将相应的参数声明为数组来说明它:
void f(char a[]) { ... }
从字面上解释,这个声明没有用,所以编译器转过身来假装你写了一个指针声明,因为这就是函数实际上会收到的内容:
void f(char *a) { ... }
谈论一个函数没有什么特别的错误,好像它“接收”一个数组,如果该函数传统上用于对数组进行操作,或者该函数在函数中被自然地视为一个数组。
这种类似数组的声明符转换为指针只能在函数形式参数声明中保存,而不是其他地方。如果转换困扰你,你就没有强迫它使用它;许多程序员已经得出结论,它造成的混乱超过了声明“看起来像”调用或函数内部使用的小优势。 (请注意,转换只发生一次;像char a2 [] []这样的东西不起作用。参见问题6.18和6.19。)
换句话说,在函数参数声明中,长度未指定的数组与指针相同。
答案 4 :(得分:1)
void evaluate(double x[], double *f)
{
// evaluate
}
实际上相当于:
void evaluate(double *x, double *f)
{
// evaluate
}
在C和C ++中。
这意味着x
参数的类型在两种情况下均为double *
。
答案 5 :(得分:0)
是的,在c中,数组被声明为
好读
答案 6 :(得分:0)
函数的参数x
是一个未指定长度的数组。这意味着您可以将任何类型double
的数组传递给它,无论大小如何。您还可以将指针传递给double
作为参数。
但有一点需要注意:您无法在数组sizeof
上使用x
运算符,因为它没有大小。