如何破译 C 中的复杂指针声明?
How to decipher complex pointer declarations in C?
所以我想举个例子:
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[];
谢谢。
y
是指向char的指针数组,z
是指向char的指针数组。 x
是指向 char
的指针
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
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。这个答案将帮助程序员手动破译任何复杂的声明。
记住这两个简单的规则:
- 总是从里面翻出来阅读声明。
- 如果有选择,总是偏爱
[]
和 ()
而不是 *
。
第一条规则简单地指出,找到正在声明的变量并开始破译声明。
对于第二条规则,如果*
在标识符之前,[]
或()
在它之后,那么标识符代表一个数组或函数(分别),而不是一个指针。
示例 1:
char *y[5];
- Variable/identifier 是
y
。
*
在 y
之前,在 []
之后。
y
必须是数组。
结合上面的解密会得到:y
是一个5
指向char
的数组。
另请注意,您始终可以使用括号来覆盖 []
或 ()
的正常优先级。
示例 2:
void (*pf) (int);
- Variable/identifier 是
pf
。
*pf
括在括号内,必须是指针。
()
跟在 *pf
之后,意味着 pf
必须指向一个函数。
- 由于
()
包含 int
,函数必须期望类型为 int
的参数。
因此,pf
是一个指向需要 int
参数且 returns 没有任何参数的函数的指针 。
现在,破译以下声明后你会得到什么
int *(*a[5])(void);
?
答案:
a
是指向函数的指针数组,该函数不需要参数并返回指向 int
.
的指针
注:
请注意,
char *y[];
char **z[];
如果它们没有声明为函数的参数,将导致编译错误。如果它们是函数的参数,则 char *y[]
等同于 char **y
并且 char **z[]
等同于 char ***z
.
如果不是这种情况,那么您需要像我在第一个示例中所做的那样指定维度。
从 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
所以我想举个例子:
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[];
谢谢。
y
是指向char的指针数组,z
是指向char的指针数组。 x
是指向 char
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
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。这个答案将帮助程序员手动破译任何复杂的声明。
记住这两个简单的规则:
- 总是从里面翻出来阅读声明。
- 如果有选择,总是偏爱
[]
和()
而不是*
。
第一条规则简单地指出,找到正在声明的变量并开始破译声明。
对于第二条规则,如果*
在标识符之前,[]
或()
在它之后,那么标识符代表一个数组或函数(分别),而不是一个指针。
示例 1:
char *y[5];
- Variable/identifier 是
y
。 *
在y
之前,在[]
之后。y
必须是数组。
结合上面的解密会得到:y
是一个5
指向char
的数组。
另请注意,您始终可以使用括号来覆盖 []
或 ()
的正常优先级。
示例 2:
void (*pf) (int);
- Variable/identifier 是
pf
。 *pf
括在括号内,必须是指针。()
跟在*pf
之后,意味着pf
必须指向一个函数。- 由于
()
包含int
,函数必须期望类型为int
的参数。
因此,pf
是一个指向需要 int
参数且 returns 没有任何参数的函数的指针 。
现在,破译以下声明后你会得到什么
int *(*a[5])(void);
?
答案:
的指针
a
是指向函数的指针数组,该函数不需要参数并返回指向int
.
注: 请注意,
char *y[];
char **z[];
如果它们没有声明为函数的参数,将导致编译错误。如果它们是函数的参数,则 char *y[]
等同于 char **y
并且 char **z[]
等同于 char ***z
.
如果不是这种情况,那么您需要像我在第一个示例中所做的那样指定维度。
从 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