是否可以传递“int *[LENGTH]”而不是“int [][LENGTH]”
Is it ok to pass `int *[LENGTH]` instead `int [][LENGTH]`?
我必须为旧代码添加新功能。旧代码有一个问题,有很多函数将数组作为参数,就像这样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])
。前者是指向数组的指针,后者是指针数组。
您的问题与您的代码不匹配,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
所需的类型。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- accum<int>(&name[0], &name[length]) 给出错误,无法将参数 1 从 'char *' 转换为 'const int *'
- 如何获取字符串形式的int变量的长度内置函数,例如string.length()
- 将std::string::length转换为int
- 是否可以传递“int *[LENGTH]”而不是“int [][LENGTH]”