几个c声明的解释?

  1. char * const *(*p)();

  2. char *(* c[10])(int **p)

上面几个声明该如何理解呢?大家能说说看法么?

阅读 1k
评论
    3 个回答
    • 12k

    1
    预备知识
    (const *) 常量指针,指针指向的这个值不能通过这个指针修改,即*p = 10;//(const *p) 是非法的
    char * (const *) 二级指针,去掉const很容易就看出来了

    typedef char * const * PPChar;

    如果定义PPChar p

    // p ------> [ p1 , p2 , p3 , p4 ]
                    |    |   |     |----> [....]
                    |    |   |----------> [....]      
                    |    |--------------> [....] 
                    |-------------------> [....]

    p 指向的值 p1,p2 是可以通过 p 改变的,但是p1,p2指向的值不能通过p1,p2改变
    start。。。。。。。
    *pp是一个指针
    PPChar (*p)()p取地址是一个函数, 即p指向一个函数,该函数的返回至类型是PPchar

    2
    c[10]:c 是一个数组,即指针
    * c[10]c[0]等是一个指针,即数组中的元素是指针
    Type1 (* c[10])(Type2 p): 数组中的元素指向函数,函数的的参数类型是int ** 返回值是 char *
    所以c是数组,其中的元素是函数指针。

    在补充点儿变量声明的解释,简要说明,自己体会:

    *p; // 1、取指针指向的值,其实指针是没有类型的,永远给分配4个字节(32位机),指针的类型是指针指向的值的类型。
        // 2、p 可以取其指向的值,因此 p 是指针。
    
    int a; // 声明一个 int 的型的变量 a
    int *p;// p 指向的值是 int 类型的,因此 p 是 int 型指针
    
    void  f(void); // 函数声明, f是一个函数
    void (*p)(void); // p 取指向的值是一个函数,所以 p 是一个函数指针
    
    const a; //  声明一个常量 a, `a=10` 非法
    int const a; // 并且 a 是 int 型的
    const int a; // a 是 int 型的,并且是一个常量。
    const *p; // p指向的值是一个常量,因此`*p = 10` 非法。 常量指针。
    * const p; // p 是一个常量,`p = NULL`非法。可以取其指向的值,所以p是指针,`*p=10` 是可以的
               // 指针常量
    
    c[10]; // c 是一个数组,长度为10
    int c[10]; // c 中的元素是 int 型的,c[i] 是 int 型的
    * c[10];  // c 中的元素是指针, [] 的优先级比较高
    int *c[10]; // c 中的元素取指向的值是 int 型的,即c 中的元素是 int型指针。
    c[10][20]; // (c[10])[20] ,c 是一个数组,其中的每一个元素又是一个大小为 20 的数组,二维数组。
    
    (*p)[10]; // p指向的值是大小为10的数组,因此 p 指向一个大小为 10 的数组。
    int (*p)[10]; // 其中的元素是 int 型的。
    p+1; // 指针+1 表示指针指向下一个元素,而 p 指向大小为 10 的数组,因此 p + 1 其实比 p大 10*sizeof(int) 个字节。
    
      • 1.8k

      函数指针。你直接百度就有。

        • 3
        • 新人请关照

        www.baidu.com 你值得拥有

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章