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

时间:2015-04-12 15:39:12

标签: c pointers declaration

所以我想举个例子:

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

感谢。

4 个答案:

答案 0 :(得分:8)

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


记住这两个简单的规则:

  1. 始终从由内到外阅读声明
  2. 如果有选择,请始终将[]()优先于*
  3. 第一条规则只是声明,找到正在声明的变量并开始从中解密声明。

    对于第二个规则,如果*在标识符之前,[]()在其后面,则标识符表示数组或函数(分别),而不是指针。

    示例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
    如果情况并非如此,那么您需要像我在第一个示例中那样指定尺寸。

答案 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