C语言(长期更新)第13讲:指针详解(三)

发布于:2025-09-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

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博客


网站公告

今日签到

点亮在社区的每一天
去签到