指针的作用,可以通过指针间接访问内存。可以用指针变量报错内存地址,用16进制表示
![](https://img.haomeiwen.com/i16668075/85f55317a9144113.png)
如上,我们定义指针变量类型需要和变量的类型一致,要加*,地址为&a即存放a的地址,我们可输出a的地址也就是p指针变量的内容
我们知道p代表地址了,但是如何获得p所对应得值呢,我们可以使用*p解引用,获得这段地址的值或者修改这段内存
![](https://img.haomeiwen.com/i16668075/c2f3dcd58d60691a.png)
如下,可以通过修改*p实现修改a
![](https://img.haomeiwen.com/i16668075/cf9953e8ea4b7b93.png)
指针变量在32位,64位操作系统分别占4,8字节,我64位电脑因为是选择跨平台,所以是相当于32位的4字节,如下
![](https://img.haomeiwen.com/i16668075/f5b5f69ea953462e.png)
空指针NULL
我们定义个指针变量都需要指向一个内存,但是我们没有变量对象时,可以指向0的地址,此时为空指针,空指针不可以解引用访问,因为0-255的内存是系统默认内存,不可以访问,如下
![](https://img.haomeiwen.com/i16668075/6a80794ad4c7723a.png)
野指针
没有去申请,却尝试访问,会报错
![](https://img.haomeiwen.com/i16668075/c76495c370f07d21.png)
这段地址并不是我们申请的,却尝试访问,报错
所以空指针和野指针都不要访问
常量指针
常量指针是指针前加上const,这里const并不是代表对应得指针变量指向不能修改,而是指向的值不能修改,如下图,p指向a,a,b都是10,那p可以再指向b,如果p指向a,a修改成20就报错
![](https://img.haomeiwen.com/i16668075/277edec074648460.png)
如下,切换相同值得指向可以通过
![](https://img.haomeiwen.com/i16668075/261836a112f38190.png)
如下,尝试修改p的引用内容提示const
![](https://img.haomeiwen.com/i16668075/35ddbe3bdbcfbbca.png)
虽然不能通过*p修改,但是修改a,可以发现p的引用内容还是可以改的,且没报错
![](https://img.haomeiwen.com/i16668075/aa51360799abf34d.png)
指针常量
格式变量类型 * const 指针变量名
指针常量可以修改指向的数据,但是不能修改指向
![](https://img.haomeiwen.com/i16668075/0f8dfcc7871b4d57.png)
如上,可以修改引用内容
![](https://img.haomeiwen.com/i16668075/7907ee88e72553e4.png)
如上,是不可以修改指向的
和常量指针的区别在于const的位置,const放在前面表示引用的p内容不可修改(可以但可以通过原变量名改),放在指针变量前表示指向不可改
指针和数组
之前我们使用索引访问数组元素,我们也可以使用指针来访问
![](https://img.haomeiwen.com/i16668075/372bee4ddafa77a0.png)
如上,我们给p指针赋值a即数组地址,按int解析引用就可以打印第一个元素
![](https://img.haomeiwen.com/i16668075/f7d3d43ab6c1be3a.png)
我们遍历所有元素,就可以使用p++实现指针的移动,这里p不是加1,而是实现int类型的单元长度移动,即4个字节
指针和函数
![](https://img.haomeiwen.com/i16668075/1176c7b6f2b7fd1b.png)
我们定义函数,调用时如上,形参修改并没有修改外部的变量
![](https://img.haomeiwen.com/i16668075/f680df858db036b1.png)
我们将地址作为值传给指针型变量,就可以实现变量内容的修改
网友评论