1.指针与const的三个类型:常量指针、常量指针
规律:const离变量类型int近还是变量名近。
例子: int wife = 24,girl = 18; //以直男、渣男、暖男指针举例,现他们的妻子24岁,一个girl18岁;
(1)常量指针
const int * zha_nan = &wife;
zha_nan = 22; //渣男指针离变量类型近,类型值不能变,这个是错误的
zha_nan = &girl; //这个是对的
(2)常量指针
int * const zhi_nan = &wife;
zhi_nan = &girl; // const修饰变量名直男,不能再指向别的变量名(girl),是错误的
*zhi_nan = 25; //这个是对的
(3)暖男指针,指向的变量和变量值都不能修改
const int * const nuan_nan = &wife;
2.二级指针用法,三级指针(一般很少用)
例子: int bao_xiang = 9999;
int *key1 = &bao_xiang;
int **key2 = &key1; //定义二级指针
二级指针存一级指针地址, 解一次引用:*key1是key1地址,解两次:**key2是9999。
二级指针 两个用处:
(1)二维数组传参;如int swap(int **array,int len)
(2)传递的实参是指针并且要修改:(这个可以用引用更好的代替)
3.指针与数组:指针数组和数组指针的辨析
例子(1): int number[4] ={3,5,1,6};
int *minAndMax[2]; // 这是指针数组:这里创建一个数组,每一个变量都是指针,用于存number数组最大值和最小值地址,注意是有2个指针
例子(2): int girls[3][2]={ {19,17},{20,18},{17,22}};
int( *age)[2]; //这是数组指针,与上面的区别是创建1个指针指向数组,所以常和二维数组搭配使用才有意义,别写成*(age)[2]
(3)指针数组访问两种方式
①普遍用数组访问法,age先指向girls的第三行,(*age)[1] 再找到第二列,如下:
age = &girls[2]; cout<< (*age)[1] <<endl;
②因为难理解少用的指针访问法,要解析两次,如下:
age = &girls[2]; cout<< *((*age)+1) <<endl;
4.void类型指针和const常引用,没有类型,C++很多的自带函数都要const void * a = 100;这种常引用写法
例子: int man = 23;
void * people = &man;
5.指针与函数结合:函数指针
(1)用处:用在C++的快排函数qsort函数qsort(array,array+len,cmp)中cmp就是传递的函数指针;
(2)定义: 以C++自带的cmp为例,类型 + (*函数名) + 函数体; 调用就是fp(a,b)
例子:bool (*fp)(const void *,const void *);
6.指针和引用在参数传递,引用就是取别名
定义 调用
(1)单个变量传参:①swap(int a,int b); swap(a,b) 这是值传递不改变值,
②swap(int *a,int *b); swap(&a,&b) 用指针传递地址
③swap(int &a,int &b); swap(a,b) 引用传递,比指针更方便和理解
(2)一维数组传参: ①int swap(int array[],int len); swap(array,len) 数组方式传递,也可以带 array[10]
②int swap(int *array,int len); swap(array,len) 指针传递方式,更常用
(3)二维数组传参:①int swap(int *array[],int len); swap(array,len) 数组方式传递
②int swap(int **array,int len); swap(array,len) 指针传递方式,更常用