C语言(长期更新)
第13讲:指针详解(三)
跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。博主主页:潼心1412o-CSDN博客
知识回顾
上节课我们学习了指针的部分内容,对基础内容有了扎实的掌握,今天我们来继续学习几种特殊的指针,坐稳了,我们发车,gogogo,出发喽!
13.1 字符指针变量
我们知道常见的用法
除此之外,还有另一种用法
指针pc存放的是常量字符串第一个字符‘a’的地址
下面我们看一道相关例题
C/C++会把常量字符串存放在一个单独的内存区域
str3和str4指向同一个字符串,故指向同一片空间,地址相同
而str1和str2则是两个数组,会开辟出不同的内存空间
故str1和str2不同,str3和str4相同
13.2 数组指针变量
前面我们学了指针数组,那数组指针又是什么呢?
很简单,存放数组的指针
p先和*结合,说明p是⼀个指针变量
指针指向的是⼀个大小为10个整型的数组,所以p是⼀个指针
指向⼀个数组,叫 数组指针
注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合
13.3 二维数组传参本质
有了数组指针的理解,我们·就可以讲二维数组传参的本质了
首先我们重新定义下二维数组
二维数组可以看作每个元素都是一维数组的数组
那么二维数组的首元素,也就是第一行,就是一维数组
我们又知道数组名是首元素的地址,所以二维数组的数组名也是第一行的地址,即一维数组的地址
那么,既然传递的是一维数组的地址,那么我们就可以使用数组指针了
p+i p类型为int(*)[5],每加一跳过一行
*(p+i)拿到的是二维数组中每个一维数组的地址,类型为int [5]
*(p+i)+j 解引用后,每加一跳过一个一维数组中存放元素的地址
*(*(p+i)+j)拿到的是一维数组中的每个元素
13.4 函数指针
函数指针就是存放函数地址的指针,未来通过地址调用函数
函数的函数名就是地址
当然,也可以通过&函数名的方式打印函数的地址,二者结果相同
那么怎么创建函数指针变量呢?
下面举个🌰
函数指针的写法与数组指针极为相似
在实际应用中,函数指针可解引用,也可不解引用
解引用的方式我们很容易理解
不解引用是怎么回事呢
很简单我们p指针存放的是add函数的地址,而add就是add函数的地址
那我们就可以很合理的认为add==p
那既然add(3,4)的使用好无问题,直接写p(3,4)当然没毛病
13.5 typedef关键字
typdef使用来类型重命名的,可以使复杂的类型简单化,方便书写和使用
比如unsigned int你可能觉得书写不太方便,就可以将这个类型重命名为uni
函数指针和数组指针的重命名有一点特殊,需要我们注意一下
13.6两个有趣的代码
突破口:0,啥意思?只能是强制类型转换呗
相当于将0强行当做一个地址,这个0地址存放的函数是一个无参的void函数
整段代码的意思是调用0地址处存放的函数
这个我们看到singal就知道,只有一种情况会出现自定义名后跟没有变量名的()
那就是函数声明。那函数声明还需要一个函数返回类型啊,说明这个函数类型是void(*)(int),
就是说这个函数返回值是一个函数指针
总结一下就是返回值为函数指针,参数类型为int和函数指针的一个函数声明
想要简化一下上面的代码,我们就可以使用typedef
13.7 函数指针数组
还是指针数组,只不过指针是函数指针
要求:函数指针的类型必须相同,包括参数和返回值
因为数组就只能存放相同类型的元素
13.8 转移表
函数指针数组具体怎么使用呢?这就要讲到转移表了。
我们先来看一下这段代码
是我们熟悉的方法,但是主函数部分代码过于冗余
让我们试一下刚才的函数数组指针
好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~
博主主页:潼心1412o-CSDN博客