几个c声明的解释?
本文介绍了几个c声明的解释?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
char * const *(*p)();
char *(* c[10])(int **p)
上面几个声明该如何理解呢?大家能说说看法么?
解决方案
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。。。。。。。*p
: p
是一个指针PPChar (*p)()
: p
取地址是一个函数, 即p
指向一个函数,该函数的返回至类型是PPchar
2c[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) 个字节。
这篇关于几个c声明的解释?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文