【C语言】指针进阶:掌握指针数组和指向指针的指针 每日一图:
本篇内容: 1.字符指针2.指针数组3.数组指针3.1数组指针的定义3.2&数组名和数组名的区别3.3数组指针的使用 4.数组参数和指针参数4.1一维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针传参 5.函数指针6.函数指针数组简易计算器 7.指向函数指针数组的指针 1.字符指针 char* 一般使用: 这里的pc就是一个字符指针变量,这种方法是让我们的字符指针指向了一个字符变量。 另一种使用方式如下: 把字符串首字符的地址赋给了一个指针。 因为这个字符串是一个常量字符串(不能被修改)所以在char*前面加一个const会更加严谨。 2.指针数组 指针数组就是存放指针的数组或存放地址的数组。 存放字符指针的数组: 这四个字符串的首字符的地址都被放在了指针数组arr中。 打印: 运行效果:
存放整形指针的数组: 打印: 运行效果:
3.数组指针 3.1数组指针的定义 数组指针也是指针。 字符指针 – 存放字符地址的指针 – 指向字符的指针 char* 整形指针 – 存放整形地址的指针 – 指向整形的指针 int* 浮点型指针 – 指向浮点型的指针 float* double* 数组指针 – 存放数组地址的指针 – 指向数组的指针 数组指针的写法: 这里的“pa”就是一个数组指针 pa和 * 号结合,他是个指针,他指向了“[10]”(10个素的数组),数组的每个素的类型是” int ” &arr取出的是数组的地址,只有数组的地址才需要数组来接收 3.2&数组名和数组名的区别 先来看一段代码: 运行效果:
可以看到前面两种写法+1都只跳过了4个字节,证明他们的类型都是“ int* “,而最后一种写法跳过了40个字节(整个数组)证明他的类型是 int(*)[10],那么我们就能理解他们之间的区别了。 数组名 – 数组首素的地址 &数组名 – 是数组的地址 数组首素的地址和数组的地址从值的角度来看是一样的,但是意义不一样。 如果我们想拿到整个数组的地址我们就可以用 &数组名,如果只想拿到 数组首素的地址 就可以用数组名。 在一维数组中很少使用数组指针,在二维数组中才可能使用。 3.3数组指针的使用 数组名表示首素的地址,对于二维数组来说,他的第1行就是他的第一个素,第一行的地址,相当于是一个一维数组的地址。 那么我们就可以放到一个数组指针里( int(*p)[4] )。 4.数组参数和指针参数 函数的参数应该如何设计呢? 4.1一维数组传参 一维数组传参的时候形参该如何写? 以上方法均可 4.2二维数组传参 二维数组传参的时候形参该如何写? 以上方法均可 4.3一级指针传参 指针变量传参,指针变量接收 当一个函数的参数部分为一级指针的时候,函数能接收什么参数? 4.4二级指针传参 二级指针传参,形参部分用二级指针接收。 当函数的参数为二级指针的时候,可以接收什么参数? 5.函数指针 前面我们讲到了数组指针:指向数组的指针。 那么函数指针是什么呢?其实就是指向函数的指针 其实函数也是有地址的,我们来看下面这条代码: 运行效果:
可以看到,我们把Add函数的地址打印了出来。 那么函数指针应该怎么写呢?很简单,我们看下面这条代码: 函数指针的写法和数组指针的写法非常相似。 首先pf是个指针,pf指向的是函数,函数的参数类型是(int int),pf指向的函数的返回类型是int,这样我们的pf就定义好了。 &函数名和函数名都是函数的地址 所以我们也可以这样写: 那我们能不能通过pf指针来调用Add函数呢? 可以。方法也很简单: 运行效果:
首先pf是个指针,指针解引用才能找到对应的函数(可以省略为pf,但方便理解我们还是写上:(*pf),调用的时候要传参,那我们就传个2和3:(*pf)(2,3),传过去之后函数计算完结果,那我们就把结果放在ret里面:int ret = (*pf)(2,3); 6.函数指针数组 想要写出函数指针数组,要从函数指针的基础上进行改造。 那么函数指针数组有什么作用呢? 我们来用函数指针数组写一个简易的计算器。 简易计算器 这里的函数指针数组代替了switch函数,简化了很多代码,但是他也有缺点:因为函数指针数组限制了他(函数里的参数类型、返回类型必须一致),所以他只能计算双目操作数。 7.指向函数指针数组的指针 建议在函数指针数组的基础上进行修改。 我们先来看一下函数指针数组: 这里的pf和[]结合说明他是一个数组,但是我们希望他是指针,那我们就在这个基础上进行修改: 我们只需要加上*然后再把ppf括起来,这时候ppf就是一个指针了。 以上就是本篇的全部内容了,希望大家看完能有所收获。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/82591.html