上一节,我们基本上介绍完了大多数的指针知识内容,现在还有些比较重要的内容要介绍,话不多说,直接上正文。
一、指向函数指针数组的指针
本质上就是一个指针,一般形式例如:int(*(*prefer)[5])(int,int),像这种套娃可以无限套下去,如一级指针过了有二级指针又有三级指针,一直到n级指针,但是由于没有必要而且导致代码可读性变低,所以我们在没有必要的情况下要避免这种写法。
二、回调函数
1.概念:回调函数就是一个通过指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时我么就说这是回调函数,回调函数不是由该函数的实现方直接调用,而是在特定的条件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
2.回调函数的基本使用
#include<stdio.h>
void print_1(char *str)
{
printf("hehe:%s",str);
}
void test(void(*p)(char*))
{
printf("test:\n");
p("hello world");
}
int main()
{
test(print_1)
return 0;
}
分析:主函数main调用test函数且将print_1函数此函数的地址传递给test函数,且定义test函数参数为函数指针指向print_1第地址,通过这个函数指针对print_1解引用print_1函数,最终输出hehe:hello world。
这种通过其他函数传递地址来调用函数的函数就叫做回调函数,这种机制称为回调机制
关于回调函数其实这种例子还不够恰当,以后我们有了更深层次的只知识我们再回过头来理解这种比较特殊的函数就会容易得多。
三、void*指针
我们在指针这一个章节知道有char*,int*,float*等等指针类型,可这个void*是头一次见,他有什么用处呢,让我们来好好研究一下吧。
1.温故知新:了解void*这个特殊的指针就要讲到我们刚刚接触指针的内容了。
指针类型:我们知道一个指针可以存储任何类型数据的地址,但是指针类型决定了指针一次能访问多少字节。如吧int型的数据放在char*类型的指针里面当该指针进行访问时,由于是char*的指针所以一次只能访问一个字节,这就导致我们去进行访问调用效率大打折扣,所以我们有会根据数据类型存储在与数据类型相对应的指针里面。
知识链接:那么这个跟我们void*指针有什么关系呢?其实void*这种指针的作用是可以存储任何类型的地址,那么有人就想说了:这不是跟其他指针一样吗,其他指针也能存储任意类型的地址啊!别急,我话还没说完,虽然的确其他类型可以存储任意类型的地址但他们进行访问该地址时并不会报错,而void*可以。有的人又纳闷了:会导致报错还觉得好?少年,不能格局太小了,仔细想想,若是有一次你传参时候对你的指针进行访问调用时恰好你的数据类型和你指针类型不同,而你的程序依然会运行,那么若是在一个项目中因为这一个错误导致结果不正确你苦苦找半天原因。那么若你用的是void*指针会报错,那何尝不是一个维护呢?而且当你进行编程是一时不知道用什么类型的指针接收地址,先用void*指针接受后面再强制类型转换,前呼后应,这不是一石二鸟吗?
补充:void*访问时会报错,是因为他是一个不确定的指针类型,那么类型都不确定访问字节自然不确定,导致报错。
结束:好了,各位道友这一章节的类容我们就彻底结束了,有什么问题或有什么我说的不对的地方请留在评论区或私信我,我们来日方长,日后好相见,谢谢大家的捧场。