指针是c语言中难度稍微高的一部分内容,同时也是为后续学号数据结构打基础,接下来就让我们进入指针的学习。
指针是什么
在计算机科学中,
指针
(
Pointer
)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“
指针
”
。意思是通过它能找到以它为地址的
内存单元
。
指针是个变量,存放内存单元的地址(编号)。
![](https://img-blog.csdnimg.cn/direct/4ac40446d9b343c8b0b44b5b57bbc3cc.png)
总结:
指针就是变量,用来存放地址的变量。
既然指针是变量,那么指针的大小是多少呢?
指针的大小在
32
位平台是
4
个字节,在
64
位平台是
8
个字节(在32位机器上,地址是32个0或1组成二进制序列,需要4个字节的空间存储;64位机器上需要8个字节的空间存储)
指针和指针类型
指针的类型列举为以下几种:
不同类型的指针用于存放不同类型变量的地址:int* 类型的指针是为了存放int 类型变量的地址。
那么指针类型的意义是什么呢?
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)
指针解引用
通过观察以上调试窗口内存的变化,我们发现类型为int*时,当解引用时一次访问四个字节,而char*一次只访问一个字节。
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。 比如:
char*
的指针解引用就只能访问一个字节,而 int*
的指针的解引用就能访问四个字节。
野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量
在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一
个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果不可知。
野指针成因
1.指针未初始化。
![](https://img-blog.csdnimg.cn/direct/e3d7012c9d2a4293856b5c75a92147c6.png)
2.指针越界访问。
![](https://img-blog.csdnimg.cn/direct/fac75c3264ad44d69546bb693ff759b1.png)
3.指针指向的空间释放
规避野指针:
1.指针初始化
2.小心指针越界
3.指针指向空间释放即置NULL
4指针使用之前检查有效性
指针的运算
指针+- 整数
![](https://img-blog.csdnimg.cn/direct/41eb1b33530847158c542c8cc46bc2ad.png)
指针-指针
![](https://img-blog.csdnimg.cn/direct/c7882900561346c88f8aa8f90a4c3dbb.png)
指针-指针得到的数值的绝对值:是指针和指针之间的元素个数。
指针的关系运算
地址是有大小的,指针的关系运算就是比较指针的大小。
![](https://img-blog.csdnimg.cn/direct/0504a90770df49ce92c000c92ab9ea4d.png)
![](https://img-blog.csdnimg.cn/direct/5f14706277614e3a9deb6fd849cb2b5b.png)
数组地址是由低到高的,所以vp地址大于数组首元素地址,即比较指针大小,代码会将vp指向的数组元素赋值为0,然后vp往前移动。
指针和数组
数组名是什么?
从以上代码我们可以看出数组名即是数组首元素地址。那么我们就可以写出下面的代码。
p+i计算的是数组arr下标为i的地址。
我们就可以直接通过指针来访问数组:
二级指针
指针变量也是变量,那么是变量就有地址,指针变量的地址存放的位置就是二级指针。
通过二级指针同样可以找到指针变量pa也就是找到a,所以同样可以打印出10。