C语言笔记8:指针进阶

指针进阶

字符指针

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*) )实现比较算法的函数的指针

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值