所以我想举个例子:
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[];
感谢。
答案 0 :(得分:8)
cdecl.org通常与此类问题相关联。毫无疑问,它更容易破译任何复杂的声明,但同时它只是提供一个抽象的信息。作为C或C ++程序员,人们应该知道如何手动解密复杂的声明。 Spiral Rule在某种程度上有所帮助,但有些cases失败了。这个答案将帮助程序员手动解读任何复杂的声明。
记住这两个简单的规则:
[]
和()
优先于*
。 第一条规则只是声明,找到正在声明的变量并开始从中解密声明。
对于第二个规则,如果*
在标识符之前,[]
或()
在其后面,则标识符表示数组或函数(分别),而不是指针。
示例1:
char *y[5];
y
。 *
位于y
之前,位于[]
之后。 y
必须是数组。 合并上述解密将导致: y
是指向5
的char
指针数组。
另请注意,您始终可以使用括号覆盖[]
或()
的正常优先级。
示例2:
void (*pf) (int);
pf
。 *pf
括在括号中,它必须是指针。 ()
跟在*pf
之后,意味着pf
必须指向一个函数。 ()
包含int
,因此函数必须要求int
类型的参数。 因此, pf
是指向函数的指针,该函数需要int
参数并且不返回任何内容。
现在,在解读以下声明后你会得到什么?
int *(*a[5])(void);
?
<强>答案:强>
a
是一个指向函数的指针数组,这些函数不需要参数并返回指向int
的指针。
注意:强> 注意两者都是
char *y[];
char **z[];
如果未将声明为函数的参数,则
将导致编译错误。如果它们是函数的参数,那么char *y[]
相当于char **y
而char **z[]
相当于char ***z
。
如果情况并非如此,那么您需要像我在第一个示例中那样指定尺寸。
答案 1 :(得分:3)
从HELPPC实用程序(David Jurgens)获取的一些示例C声明在九十年代保存了我的(编程)生活(此处的实用程序的在线版本:http://stanislavs.org/helppc)
int i; i as an int
int *i; i as a pointer to an int
int **i; i is a pointer to a pointer to an int
int *(*i)(); i is a pointer to a function returning a
pointer to int
int *(*i[])(); i is an array of pointers to functions
returning pointers to an int
int *i[5]; i is an array of 5 pointers to int
int (*i)[5]; i is a pointer to an array of 5 ints
int *i(); i is a function returning a pointer to an int
int (*i)(); i is a pointer to a function returning int
int *(*(*i)())[5] i is a pointer to a function returning a
pointer to an array of 5 pointers to an int
答案 2 :(得分:0)
y
是一个指向char的指针数组,z
是一个指向char的指针数组。 x
是指向char
答案 3 :(得分:0)
char **x; //x is a pointer to a pointer to char
char *y[]; // y is an array of pointers to char
char **z[]; // z is an array of pointers to pointers to char