1.字符指针变量
在指针类型中我们知道有一种指针类型为字符指针char*;
还有一种方式使用如下:
代码
const char* pstr = "hello bit.";
特别容易让同学以为是把字符串
hello bit
放到字符指针 pstr
⾥了,但是本质是把字符串
hello bit.
⾸字符的地址放到了pstr中。
2.数组指针变量
2.1数组指针变量是什么?
我们知道指针数组是存放指针的数组,是一个数组,而这与数组指针的本质完全不同,数组指针是一个指向数组的指针。
我们已经熟知:
• 整形指针变量: int * pint; 存放的是整形变量的地址,能够指向整形数据的指针。
• 浮点型指针变量: float * pf; 存放浮点型变量的地址,能够指向浮点型数据的指针。
那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。
我们思考一下下面两个表达式:
int* p1[10]
int(*p2)[10]
第一个表达式p1是表示地址与【10】结合起来就是一个数组,所以第一个表达式的含义为一个数组里面存放了10个指针,叫做 指针数组。
第二个表达式
p先和*结合,说明p是⼀个指针变量变量,然后指着指向的是⼀个⼤⼩为10个整型的数组。所以
p是⼀个指针,指向⼀个数组,叫 数组指针。
2.2数组指针变量的初始化
数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的
&
数组名 。
这样我们数组指针变量的初始化就完成了。
3.二维数组传参的本质
我们一般用二维数组传参打印二位组数的代码是这样写的
这⾥实参是⼆维数组,形参也写成⼆维数组的形式,那还有什么其他的写法吗?
在之前我们了解了数组指针的概念,我们利用数组指针用指针指向数组的每一行。我们再次理解⼀下⼆维数组,⼆维数组起始可以看做是每个元素是⼀维数组的数组,也就是⼆维 数组的每个元素是⼀个⼀维数组。那么⼆维数组的⾸元素就是第⼀⾏,是个⼀维数组。
所以,根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀ 维数组的地址。根据上⾯的例⼦,第⼀⾏的⼀维数组的类型就是 int [5]
,所以第⼀⾏的地址的类 型就是数组指针类型 int(*)[5]
。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀
⾏这个⼀维数组的地址。
那么形参也是可以写成指针形式的。如下:
![](https://img-blog.csdnimg.cn/direct/2f66166613bc4a9c9f7050d216485ff9.png)
4.函数指针变量
既然存在数组指针变量,我们考虑到函数是有地址的,那么就会有函数指针变量。我们进行函数指针的创建。
我们再试一下整形函数指针类型的创建
![](https://img-blog.csdnimg.cn/direct/852432bde7be43628a20ced475b9d669.png)
5.函数指针数组
上面介绍了函数指针变量,接下来介绍函数指针数组。
函数指针数组就是把函数的指针储存在一个数组当中,可以让有些代码更加简洁。接下来我举个计算器理论的例子。
这是最基本的计算器原理,但是看看代码很长,所以我们可以利用函数指针数组来进行优化!
优化代码如下:
![](https://img-blog.csdnimg.cn/direct/1edc1161d0cd436db11a288ee0b31eec.png)
希望大家可以理解函数指针数组并且运用到日常代码中,指针学起来比前几章难一些,希望大家可以坚持到底!!!