我必须为旧代码添加新功能。旧代码有问题,有很多函数将数组作为参数,类似于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;
}
编辑如果问题的答案为“是”,请指出标准文件的段落。
答案 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>