是否可以传递“int *[LENGTH]”而不是“int [][LENGTH]”

Is it ok to pass `int *[LENGTH]` instead `int [][LENGTH]`?

本文关键字:int LENGTH 是否      更新时间:2023-10-16

我必须为旧代码添加新功能。旧代码有一个问题,有很多函数将数组作为参数,就像这样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;
}

如果问题的答案为"是",请指出标准文档的段落。

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

您的问题与您的代码不匹配,xmain中具有类型int (*)[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所需的类型。