当前位置:  开发笔记 > 运维 > 正文

C变量声明中的括号是什么意思?

如何解决《C变量声明中的括号是什么意思?》经验,为你挑选了3个好方法。

有人可以解释这意味着什么吗?

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)变量声明,并用简单的单词拼写出来.



1> Brian R. Bon..:

括号是什么?

在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]



2> Paul Tomblin..:

有一个非常酷的程序叫做"cdecl",你可以为Linux/Unix下载,也可能为Windows下载.你粘贴一个C(或C++,如果你使用c ++ decl)变量声明,并用简单的单词拼写出来.



3> Artelius..:

如果您知道如何在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];

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有