指针进阶
字符指针
C/C++会把常量字符串存储到单独的一个内存区域,当 几个指针指向同一个字符串的时候,他们实际会指向同一块内存。
char * string = "Hello World";
//右侧为常量字符串,*string无法修改
//标准写法
const char * string1 = "Hello World";
const char * string2 = "Hello World";
string1 == string2 // 指向同一块内存空间
指针数组
存放一群同类型指针变量的数组
int* p1[10];
数组指针
数组指针的定义
数组指针是:能够指向数组的指针
区分:
int * p1[10]; //指针数组:10个int*类型的元素组成的数组,类型为int*[10]的数组
int (*p2)[10]; //数组指针:1个指向int[10]类型数据的指针,类型为int[10]*的指针
解释:
int (*p)[10];
//解释:p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组
//所以p是一个指针,指向一个数组,叫数组指针
//这里要注意:优先级:[] > */()> * ,所以必须加上()来保证p先和*结合
&数组名VS数组名
&arr和arr,虽然值是一样的,但是意义是不一样的
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。(细细体会一下)
eg:数组的地址+1,跳过整个数组的大小
二维数组的数组名----------->首元素地址-------------->第一行
函数指针
定义
Add == &Add --------- 函数名就是地址,&函数名也是地址
int (*pfunc)(int, int) = &Add;//&Add == pfunc
int (*pfunc)(int, int) = Add;//Add == pfunc
int ret = (*pfunc)(2,3);//Add = *pfunc
int ret = pfunc(2,3);//Add == pfunc
//总结:Add == &Add == pfunc == *pfunc
函数指针类型重定义
int (*name1)(int, int);
typedef int (pfun_t)(int, int);//对int(*)(int, int)的函数指针类型重命名为pfun_t
pfun_t name2;
函数指针数组
int (*pfun_arr[10])(int, int);
//pfun_arr 先和 [] 结合,说明 pfun_arr 是数组
//数组的元素是 void (*)(void, void) 类型的函数指针
函数指针数组的用途:转移表
eg:计算器
int (*pfun_arr[5])(int, int) = {NULL, Add, Sub, Mul, Div};
ret = (pfun_arr[input])(x, y);
指向函数指针数组的指针
int (*pfun)(int, int) = Add;
//函数指针
int (*pfun_arr[5])(int, int) = {NULL, Add, Sub, Mul, Div};
//函数指针数组
int (*(*p_pfun_arr_)[5])(int, int) = &pfun_arr;
//指向函数指针数组的指针
回调函数
回调函数就是一个通过函数指针调用的函数
eg:qsort() -------- 快速排序函数
int (*sort_func)(const void* p1, const void* p2){
...
return ...;
}//比较算法函数----一个回调函数
qsort((void*)arr, num, sizeof(arr[0]), sort_func);
//qsort函数(stdilib.h)————快速排序
//参数1(void*)为排序数组首元素地址
//参数2(size_t)为参与排序数组元素的个数
//参数3(size_t)为每个数组元素的字节大小
//参数4( int (*)(const void*, const void*) )实现比较算法的函数的指针