有人可以解释这意味着什么吗?
int (*data[2])[2];
Brian R. Bon.. 40
括号是什么?
在C括号中[]的优先级高于星号*
维基百科的好解释:
要将变量声明为指向数组的指针,我们必须使用括号.这是因为在C括号([])中的优先级高于星号(*).因此,如果我们希望声明一个指向数组的指针,我们需要提供括号来覆盖它:
double (*elephant)[20];
这声明elephant是一个指针,它指向的类型是一个包含20个double值的数组.
要声明指向指针数组的指针,只需组合符号即可.
int *(*crocodile)[15];
来源.
而你的实际案例:
int (*data[2])[5];
data是一个包含2个元素的数组.每个元素都包含一个指向5个int数组的指针.
所以你可以在代码中使用你的'数据'类型:
int (*data[2])[5]; int x1[5]; data[0] = &x1; data[1] = &x1; data[2] = &x1;//<--- out of bounds, crash data has no 3rd element int y1[10]; data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10]
Paul Tomblin.. 15
有一个非常酷的程序叫做"cdecl",你可以为Linux/Unix下载,也可能为Windows下载.你粘贴一个C(或C++,如果你使用c ++ decl)变量声明,并用简单的单词拼写出来.
括号是什么?
在C括号中[]的优先级高于星号*
维基百科的好解释:
要将变量声明为指向数组的指针,我们必须使用括号.这是因为在C括号([])中的优先级高于星号(*).因此,如果我们希望声明一个指向数组的指针,我们需要提供括号来覆盖它:
double (*elephant)[20];
这声明elephant是一个指针,它指向的类型是一个包含20个double值的数组.
要声明指向指针数组的指针,只需组合符号即可.
int *(*crocodile)[15];
来源.
而你的实际案例:
int (*data[2])[5];
data是一个包含2个元素的数组.每个元素都包含一个指向5个int数组的指针.
所以你可以在代码中使用你的'数据'类型:
int (*data[2])[5]; int x1[5]; data[0] = &x1; data[1] = &x1; data[2] = &x1;//<--- out of bounds, crash data has no 3rd element int y1[10]; data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10]
有一个非常酷的程序叫做"cdecl",你可以为Linux/Unix下载,也可能为Windows下载.你粘贴一个C(或C++,如果你使用c ++ decl)变量声明,并用简单的单词拼写出来.
如果您知道如何在C中读取表达式,那么您距离读取复杂的声明只有一步之遥.
是什么
char *p;
实际意思?这意味着它*p
是一个char.是什么
int (*data[2])[5];
意思?这意味着它(*data[x])[y]
是一个int(提供0 <= x <2且0 <= y <5).现在,只要想想它的含义是什么.data
必须是...一个2 ...指针的数组...到5 ...整数的数组.
难道你不觉得这很优雅吗?您所做的只是说明表达式的类型.一旦你掌握了这一点,声明永远不会再吓到你!
"快速规则"是从变量名开始,向右扫描直到你点击a),回到变量名并向左扫描,直到你点击(然后"走出"一对括号,并重复这个过程.
让我们把它应用到荒谬的事情上:
void **(*(*weird)[6])(char, int);
weird
是指向函数的6个指针数组的指针,每个函数接受一个char和一个int作为参数,并且每个指针返回一个指向void的指针.
现在你知道它是什么以及它是如何完成的...... 不要这样做.使用typedef将声明分解为更易于管理的块.例如
typedef void **(*sillyFunction)(char, int); sillyFunction (*weird)[6];