指针变量用来记录地址数据,如果一个指针变量中记录了一个存储区的地址则可以使用这个指针变量找到那个存储区
通俗的我们可以类似的理解为,指针变量记录的是一个地址。举个例子,我们将一栋楼看作存储区的话,每一户的门牌号可以理解为地址。推开门进到家里面,家里面就是存储区。指针变量记录的就是门牌号。内存我们在使用的时候,就像是排列整齐的方格,每个方格类似于一个房间。内存的地址就是门牌号。我们可以通过这个内存的门牌号获取到存储区里面的数值。
![720758dd48ff2569f337489a2a4df3db.png](https://i-blog.csdnimg.cn/blog_migrate/43a8f5430e5fbd18ddf37c3594bfa35f.jpeg)
这个函数当中,*p_num,*p_num1声明的时候初始化为NULL,即在内存当中申请了一个空间用来存放地址。那么存放谁的地址呢。&num意思为取num的地址,赋值给p_num。此时,p_num里面存放的即为num变量的地址。
只有记录有效地址的指针才能使用
指针变量只有一种使用方法就是根据它找到捆绑的存储区
指针变量也分类型,不同类型的指针适合与不同存储区捆绑
可以在一条语句中声明多个同类型指针,必须在每个指针变量名称前单独加*
没有捆绑的指针分成两类
1.空指针里面记录空地址(NULL),这个地址的数值就是0
2.野指针里面记录任意不可以使用的地址程序中禁止出现野指针,所有指针变量必须初始化
指针变量初始化的时候*没有参与初始化过程
演示:
1.使用指针变量调整三个整数变量内容的顺序,指针和变量之间的捆绑关系会随着程序的执行不断改变
![842b650b3cd6e56f0e137132d271c65c.png](https://i-blog.csdnimg.cn/blog_migrate/20993a2c5625cee9d8e3293d45da067a.jpeg)
可以把指针看作是变量的某种身份,如果用一个指针记录数组中第一个存储区的地址就可以根据这个指针找到数组中每个存储区
这个时候可以认为指针间接捆绑了数组中每个存储区
![169c314606008572ce61f00460da03a3.png](https://i-blog.csdnimg.cn/blog_migrate/56d407ea529e21c9f129d0a59b0da790.jpeg)
可以在指针后使用下标表示数组中某个存储区地址数据可以进行如下计算
地址 + 整数 地址 - 整数 地址 - 地址
地址数据加减整数n事实上加减的是n个捆绑存储区的大小
地址之间做减法结果是一个整数,这个整数代表两个地址之间包含的捆绑存储区个数
计算机内部对下标的处理就是把前面的地址加下标得到下标对应存储区的地址,然后找到这个存储区
指针和数组名称的区别
1.数组名称不可以被赋值,指针可以被赋值
2.对它们进行sizeof计算结果不同
3.对它们进行取地址操作结果不同
![01d7d545e203fa1ca1beedce508e39df.png](https://i-blog.csdnimg.cn/blog_migrate/0c30a6247b417d262504e9cd49b9f192.jpeg)
所有跨函数使用存储区都是通过指针实现的数组做形式参数的时候真正的形式参数其实是一个指针
练习:
1.编写函数把主函数中两个变量内容交换
![93455bfc258462f78c72aaeef5344c0e.png](https://i-blog.csdnimg.cn/blog_migrate/4fbea520608b5f01d17b120688874431.jpeg)
声明指针变量的时候可以使用const关键字
![b7dfc07d739d93d2ab8d3549dc1eab4f.png](https://i-blog.csdnimg.cn/blog_migrate/1776ff803f56301d97183134953acbf7.jpeg)
如果const关键字写在类型名称前就表示不可以通过这个指针对捆绑存储区进行赋值,但是可以对指针本身的存储区进行赋值
当跨函数使用存储区的时候尽量在指针声明前使用上述方法增加const关键字
![04d41e21b61d192b23c31b78dd8679be.png](https://i-blog.csdnimg.cn/blog_migrate/8c6c25c7e1cdc166b936856a0340fbf2.jpeg)
如果声明指针时把const关键字加在指针变量,名称前就表示不可以对指针本身的存储区做赋值,但是可以对捆绑存储区做赋值
可以在声明指针时在*前使用void表示类型名称,这种指针叫做无类型指针
![10d5bcafd67edc6140bb1094853bcf02.png](https://i-blog.csdnimg.cn/blog_migrate/b88d18e8b864424d00dfab64befdcd10.jpeg)
这种指针可以和任意类型的存储区捆绑,无法通过指针知道捆绑存储区的类型
无类型指针既不可以直接在前面加*也不可以做加减整数的计算
无类型指针必须首先强制类型转换成有类型指针然后才能使用
无类型指针通常作为函数的形式参数使用
![49515874defc46e4a54138efcdb04b55.png](https://i-blog.csdnimg.cn/blog_migrate/ca0b0ff49a23bab6f7912ad6f74e61ec.jpeg)
作业:
1.编写程序把一个数组中的所有内容前后颠倒
比如数组中原有内容是1 2 3 4 5颠倒后内容是5 4 3 2 1
要求使用指针编写程序