是否可以传递`int * [LENGTH]`而不是`int [] [LENGTH]`?

时间:2011-05-10 12:07:03

标签: c++

我必须为旧代码添加新功能。旧代码有问题,有很多函数将数组作为参数,类似于f(int x[][MAX_LENGTH])。所以我不想问:通过int *[MAX_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;
}

编辑如果问题的答案为“是”,请指出标准文件的段落。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您的问题与您的代码不符,x中的main类型为int (*)[3],而非int *[3]。在这个例子中,括号是重要的,因为第一个是指向数组的指针,第二个是指针数组。

您的函数调用f(x)有效,因为您的函数声明等同于

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

声明为数组的函数参数将转换为等效的指针类型。 (ISO / IEC 14882:2003 8.3.5 [dcl.fct] / 3)

x中的{p> main类型为v3*,其typedef的扩展名为int (*)[3],这正是f所需的类型。< / p>