一、字符指针
char* p= "hello world"
printf(*p),程序语句会输出“h”
本质上是把“hello world”这个字符串的首地址存储在了字符指针变量p中
典型例题:
二、指针数组
指针数组是数组,数组中存放的是指针(地址)
举例:
int* arr1[3], 存放整型指针的数组
char* arr2[3],一级字符指针数组
char** arr3[3],二级字符指针数组
三、数组指针
数组指针是数组还是指针?
是指针!指向数组的指针
代码举例:
int arr[] = (1,2,3,4);
int (*parr)[10] = &arr;
parr就是一个数组指针,存放的是数组的地址
&数组名 vs 数组名
&数组名:取出的是数组的地址
数组名:取出的是首元素的地址
通常情况下,数组名是数组首元素的地址
但有两个例外:
1、sizeof(数组名)-数组名表示整个数组,计算的是整个数组大小,单位是字节
2、&数组名-数组名表示整个数组,取出的是整个数组的地址
对数组指针进行解引用相当于得到一个数组名
应用举例:
在函数中,用数组指针接受二维数组地址参数,
区分:
四、数组参数、指针参数
1、一维数组传参
2、二维数组传参
总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。原因在于,为了方便运算,二位数组可以不知道多少行,但必须知道一行多少元素
总结:二维数组如果以指针形式传递,需要数组指针
3、一级指针传参
一级指针传参,一级指针接受
思考:当一个函数的参数参数部分是一级指针时,函数接受什么参数呢?
同样,函数接受的是一个一级指针
4、二级指针传参
思考:当函数的参数是二级指针的时候,可以接受什么参数?
可以有三种形式:
知识汇总:
五、函数指针
指向函数的指针!存放的是函数的地址
&函数名 - 取到的就是函数的地址
同时:函数名,也是函数的地址
注意:
函数指针编写格式:
返回值类型 (*指针名)(参数类型......)
如,对上述Add函数:
如何用函数指针调用函数?
//二者等价
int ret = (*pf)(3,5)
int ret = pf(3,5)
//不可写成
int ret = *pf(3,5)
//原因在于()的优先级高于*,
//理解为对pf函数的返回值进行解引用
阅读两段有趣的代码:
推荐《C陷阱和缺陷》,本书中又提及这两个代码
代码一解读:
代码二解读:
代码二,函数声明简化:
typedef - 对类型进行重定义
六、函数指针数组
概念:存放函数指针的数组
同理:在函数指针数组中,Add可以写为pf1,Sub可以写为pf2,原因上文有所提及,二者等价
函数指针数组的用途:转移表—《c和指针》,起跳板作用,简化代码
七、指向函数指针数组的指针
释义:是一个指针,指针指向一个数组,数组的元素都是函数指针
如何定义?
数据类型(*(*指针名)[数组长度])(参数类型 ,参数类型)
举例:int(*(*p3)[4])(int,int) = &p2
p2为函数指针的数组
八、回调函数
回调函数是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们称其为回调函数。
喜欢或有所帮助,就帮忙点个赞吧~~~