是否可以通过`int * [LENGTH]`而不是`int [] [LENGTH]`?

问题描述:

我必须为旧代码添加新功能。旧的代码有一个问题,有很多函数将数组作为参数,像这样的f(int x[][MAX_LENGTH])。所以我不想问是否可以(标准)通过int *[MAX_LENGTH]而不是?换句话说,代码是以下标准?是否可以通过`int * [LENGTH]`而不是`int [] [LENGTH]`?

# include <iostream> 
using namespace std; 

void f(int x[][3]) 
{ 
    for(int i = 0; i < 2; ++i) 
    { 
     for(int j = 0; j < 3; ++j) 
      cout << x[i][j] << " "; 
     cout << endl; 
    } 
} 

int main() 
{ 
    typedef int v3 [3]; 
    v3 *x; 
    x = new v3 [2]; 
    for(int i = 0; i < 2; ++i) 
     for(int j = 0; j < 3; ++j) 
      x[i][j] = i * 3 + j; 

    f(x); 

    delete [] x; 
    return 0; 
} 

编辑请如果这个问题的答案是“YES”点标准文件的段落。

您的问题与您的代码不匹配,xmainint (*)[3],而不是int *[3]。在这种情况下,括号是重要的,因为第一个是指向数组的指针,第二个是指针数组。

你的函数调用f(x)是有效的,因为你的函数声明等效于声明为数组转换为相应的指针类型

void f(int (*x)[3]) 

功能参数。 (ISO/IEC 14882:2003 8.3.5 [dcl.fct]/3)

xmain已键入v3*,这扩大了typedefint (*)[3]这正是由f所需的类型。

编译器重写f(int x[][MAX_LENGTH])f(int (*x)[MAX_LENGTH]),与f(int *x[MAX_LENGTH])不同。前者是指向数组的指针,后者是指针数组。

+0

但是,在这个例子中,'x'的类型确实是'int(*)[3]'。所以这个例子是正确的 - 它甚至不需要在函数参数“x”上进行转换。 – aschepler 2011-05-10 12:42:37

+0

@asch:Mihran特意询问他是否可以将参数重写为int * [MAX_LENGTH]'。我的答案是否定的,因为这会改变语义。 – fredoverflow 2011-05-10 12:45:59