C喜欢数组语法?

时间:2012-09-27 16:11:54

标签: c++ c arrays syntax

double x[]的语法是什么?

声明一个数组是一种C方式吗?

如果我有像

这样的功能
void evaluate(double x[], double *f)
{
   // evaluate
}

我可以传递任何长度的参数x吗?

7 个答案:

答案 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*xdouble x[]double x[3]double x[17]double x[],则其工作方式相同;在所有这些情况下,x都被视为double*

答案 2 :(得分:3)

在函数的参数列表中,double x[]double *x相同。

  

我可以传递任何长度的参数x吗?

是的,你可以通过。但是无法知道函数x中数组evaluate的长度。所以你可能也希望传递长度。

答案 3 :(得分:2)

C FAQ, Section 6.4

  

由于数组会立即衰减为指针,因此数组实际上永远不会传递给函数。您可以假装函数接收数组作为参数,并通过将相应的参数声明为数组来说明它:

  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)

答案 6 :(得分:0)

函数的参数x是一个未指定长度的数组。这意味着您可以将任何类型double的数组传递给它,无论大小如何。您还可以将指针传递给double作为参数。

但有一点需要注意:您无法在数组sizeof上使用x运算符,因为它没有大小。