指针的分类
http://mba.shengwushibie.com/itbook/BookChapter.asp?id=39453
1. 按指向的对象划分
整型指针、浮点指针、字符指针、数组指针、指针数组、结构体指针、函数指针等。
int *p_int;
float *p_float;
char *p_char;
char (*p_array)[2]; // 数组指针
char *p_parray[2]; // 指针数组
char (*p_func)(int);
2. 按指针的多级性划分
单级间指、二级间指、三级间指等。
int *p_int1; //单级
int **p_int2; //两级
int ***p_int3; //三级
3. 按指针定以后是否可变划分
常量指针,可变指针。
int i_int; // 整型变量
int *p_int; // 指针变量
const int *p_int2 = &i_int; // 指针可变,所指内容不能变。
int const *p_int3 = &i_int; // 指针可变,所指内容不能变。
int *const p_int4 = &i_int; // 指针不可变,所指内容可变。
const int *const p_int5 = &i_int; // 指针不可变,所指内容不可变。
个人理解:关键字const优先匹配其前面的数据类型,如果前面没有,则优先匹配后面第一个数据类型。
例如:
int const *p; 优先匹配int,因此数据内容不可变,但指针*没被修饰,可变。
const int *p; 优先匹配int,数据内容不可变,指针可变。
int* const p; 优先匹配*,指针不可变,数据内容可变。
const int* cosnt p; 第一个const修饰int,第二个const修饰*,数据内容和指针都不可变。
另外:
int (*p_array)[2]; 因为有括号,*修饰p_array,int只好修饰这个数组,即p_array是一个指向数组的指针。即数组指针
int *p_parray[2]; 没有括号,*修饰int,说明是一个整形指针,然后修饰数组array,说明这个数组里的每个元素都是一个指针。即指针数组。
此外:
指针常量与常量指针,和 数组指针与指针数组一样绕口。
理解方式:指针在前面不可变,在后面可变
指针常量:即指针不可变,数据内容可变。
常量指针:指针可变,数据内容不可变。