gpt4 book ai didi

c - 如何破译 C 中的复杂指针声明?

转载 作者:太空狗 更新时间:2023-10-29 17:18:21 25 4
gpt4 key购买 nike

所以我想举个例子:

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[];

谢谢。

最佳答案

cdecl.org通常与此类问题有关。毫无疑问,它更容易破译任何复杂的声明,但同时它只是提供了一个抽象的信息。作为一名 C 或 C++ 程序员,应该知道如何手动破译复杂的声明。 Spiral Rule在某种程度上有所帮助,但在某些方面失败了 cases .这个答案将帮助程序员手动破译任何复杂的声明。


记住这两个简单的规则:

  1. 始终从由内而外阅读声明。
  2. 当有选择时,总是偏爱[]() 而不是*

第一条规则简单地指出,找到正在声明的变量并开始破译声明。

对于第二条规则,如果*在标识符之前,[]()在它之后,那么标识符代表一个数组或函数(分别),而不是指针。

示例 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 **ychar **z[] 等同于 char ***z.
如果不是这种情况,那么您需要像我在第一个示例中所做的那样指定维度。

关于c - 如何破译 C 中的复杂指针声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29591245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com