所以我想举个例子:
int *pi; // pi is a pointer that points to an integer
const int *cpi; // cpi is a pointer that points to a constant integer
char *pc; // pc is a pointer to a char
我怎样才能阅读这些:
char **x; //x is a pointer to a char pointer?
char *y[];
char **z[];
Thanks.
cdecl.org is often linked to such questions. No doubt that it make easier to decipher any complex declaration, but at the same time it just provide an abstracted information. Being a C or C++ programmer one should know how to decipher complex declaration manually. Spiral Rule help to some extent but fails in some cases. This answer will help programmers to decipher any complex declaration manually.
记住这两个简单的规则:
- 请务必阅读来自反了.
- 当有选择的时候,总是偏爱
[]
and ()
over *
.
第一条规则简单地指出,找到正在声明的变量并开始从中破译声明。
对于第二条规则,如果*
在标识符之前并且[]
or ()
跟随它,则标识符代表数组或函数(分别),而不是指针。
示例1:
char *y[5];
- 变量/标识符是
y
.
-
*
先于y
并遵循[]
.
-
y
必须是一个数组。
结合以上解密将导致:y
是一个数组5
指向char
.
另请注意,您始终可以使用括号来覆盖正常优先级[]
or ()
.
示例2:
void (*pf) (int);
- 变量/标识符是
pf
.
-
*pf
括在括号中,它必须是一个指针。
-
()
如下*pf
, means pf
必须指向一个函数。
- Since
()
包围int
,函数必须需要一个类型的参数int
.
So, pf
是一个指向函数的指针,该函数需要一个int
参数并且不返回任何内容.
现在,破译以下声明后你会得到什么
int *(*a[5])(void);
?
Answer:
a
是一个指向函数的指针数组,该函数不需要参数并返回指向的指针int
.
Note:请注意,两者
char *y[];
char **z[];
如果它们没有声明为函数的参数,将导致编译错误。如果它们是函数的参数那么char *y[]
相当于char **y
and char **z[]
相当于char ***z
.
如果情况并非如此,那么您需要像我在第一个示例中所做的那样指定尺寸。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)