Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
230 views
in Technique[技术] by (71.8m points)

几个c声明的解释?

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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) 个字节。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...