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
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) 个字节。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…