是否可以通过`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”点标准文件的段落。
答
您的问题与您的代码不匹配,x
在main
有int (*)[3]
,而不是int *[3]
。在这种情况下,括号是重要的,因为第一个是指向数组的指针,第二个是指针数组。
你的函数调用f(x)
是有效的,因为你的函数声明等效于声明为数组转换为相应的指针类型
void f(int (*x)[3])
功能参数。 (ISO/IEC 14882:2003 8.3.5 [dcl.fct]/3)
x
在main
已键入v3*
,这扩大了typedef
是int (*)[3]
这正是由f
所需的类型。
答
编译器重写f(int x[][MAX_LENGTH])
为f(int (*x)[MAX_LENGTH])
,与f(int *x[MAX_LENGTH])
不同。前者是指向数组的指针,后者是指针数组。
但是,在这个例子中,'x'的类型确实是'int(*)[3]'。所以这个例子是正确的 - 它甚至不需要在函数参数“x”上进行转换。 – aschepler 2011-05-10 12:42:37
@asch:Mihran特意询问他是否可以将参数重写为int * [MAX_LENGTH]'。我的答案是否定的,因为这会改变语义。 – fredoverflow 2011-05-10 12:45:59