*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
预备知识
(const *)
常量指针,指针指向的这个值不能通过这个指针修改,即*p = 10;//(const *p)
是非法的char * (const *)
二级指针,去掉const
很容易就看出来了如果定义
PPChar p
则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
是数组,其中的元素是函数指针。在补充点儿变量声明的解释,简要说明,自己体会: