基础类型声明
int a = 1; // int型变量a,初始化为1。
const int b = 1; // int型常量b,初始化为1,后续不可修改。
void add(int,int); // void型函数,或称返回值为void的函数,具体还可以称为形参是两个int的返回void的函数。
普通指针声明
int b = 3;
int * a = &b; // 声明指针变量a,初始化为b的地址,或称初始化指向b。
// a是指向int型数据的指针,所以称a是int型指针。
*a = 5; // 此后b值为5。
注意, “*”出现在声明中时并不代表解析引用,只代表指针类型符,“*”出现在其它语句中才代表解析引用。
所谓解析引用,就是把指针变量中存储的地址解析,之后相当于 解析引用符和指针变量
结合成为了 指针变量存储的地址对应的变量
。指针的详细用法请见其它博客。
(解析引用是我自造方便理解的概念,实际其官方称呼为dereference
,即解除引用)
指针函数和函数指针
运算符优先级与结合性
void * malloc(int); // 返回空类型指针的函数,一种指针函数。
// () 优先级最高,且结合性是从左往右,所以 malloc 先与()结合,声明 malloc 是一个函数。
// void 和 * 是优先级同级的类型符,但结合性是从右往左,所以 malloc 返回值是一个指针,且该指针是 void 类型的。
// malloc是程序申请内存时需要使用的函数,申请的内存空间首地址被装到一个空类型指针变量中返回以供使用。
int * func(); //返回int型指针的函数,一种指针函数。
void add(int,int);
void (*func_p)(int,int) = add; // 声明函数指针并初始化指向函数add。
// ()优先级最高,且从左往右结合,故先看 (*func_p) 声明了 func_p 为指针,后续添加的类型符只能声明指针类型,也就是指针所指的数据的类型。
// (int, int) 声明指针类型为拥有相应参数的函数,最前面的 void 声明该函数返回值为 void。
指针数组和数组指针
[]作为数组声明符时与()作为函数声明符时的优先级和结合性一致。
int *a []; // a 先与 [] 结合,声明 a 是一个数组。数组类型为int型指针。故a为int型指针数组。
int (*a)[]; // a 先与 * 结合,声明 a 是一个指针。指针类型为int型数组。故a为int数组指针。
指针常量和常量指针
const表示只读限制,当其右跟类型符时,const限定该类型为只读;另一种情况,const限定其左邻类型符“*”为只读。不论哪种情况,const是对数据类型的修饰,而不直接与变量名结合。
const int * a; // 从 a 开始,* 从右往左结合先结合 a,声明 a 为指针。
// 接着,int 原本声明指针类型为整型,被 const 限定后声明指针类型为只读整型,即指针指向一个只读整型。
// 此时 a 是 整型常量指针。
int * const a; // 从 a 开始,const 限定 *,* 原本声明 a 为指针,* 经过 const 限定后声明 a 为只读的指针
// 即 * const 共同声明 a 为指针常量,最后,该指针为 int 类型。
// 此时 a 是 整型指针常量。