目录
一:什么是指针
指针
指针是一种具有指向性的东西,在现实生活中,我们想要去到某一个具体地方,比如去朋友家,那么就必须要有盆友家的地址。在计算机中,如果我们要想访问一块内存空间,那么我们也可以拿到这块内存空间的地址来进行访问,在计算机中的内存地址也可以称为指针。
指针变量
指针变量是用来存放指针的一种变量,我们可以将地址存放到指针变量中。
//指针变量的创建:类型名* 变量名 或者 类型名 *变量名
int* i;
int *i;
&和*操作符
&->取地址操作符,用来得到不同类型的变量的在内存空间的地址
*->指向运算符,用来访问地址处的内存空间
&a; //得到a的地址
int* i //创建一个指针变量
int* i = &a;//将a的地址赋值给i变量,进行初始化
二:内存单元了解指针
什么是内存单元
上面是张内存图,左边是一个内存单元的地址,右边是内存单元存储的数据(图中是16进制),每个内存单元占一个字节空间的大小。
为什么不同类型的指针变量都是4/8个字节大小呢
在32位机器上,每个地址都是由32个比特位组成的,相当于一个整形的大小,那么存储这样一个地址就需要4个内存单元,而每个不同类型指针变量又只需要存一个地址, 所以大小相同,并且都为4个字节。
指针权限的概念
一个整型大小为4个字节,那么需要4个内存单元来存储数据,每个内存单元都有一个地址,那么我们是不是需要将4个内存单元的地址都储存起来呢?从指针变量的大小来看,显然不是,一个整形的4个内存单元的地址是连续的,那么只需要得到首地址就行,但是单单这样计算机在访问的时候是不知道要往后读取几个内存单元的数据的,所以就有了指针权限的概念。
为什么C语言要有不同类型的指针呢?就是可以让计算机在访问的时候知道要读取多少个字节的数据,也可以称不同类似的指针权限不同。
三:指针的运算
指针和整数:
指针加减整数其实是地址向高位移动和向地位移动,但是地址移动的多少跟指针的权限有关;
从上面的结果可以看出,指针和整数可以相加减的,但是移动的多少跟指针的类型(或者权限)有关;
指针和指针:
可以看出,指针和指针也是可以相加减的,并且结果是一个整数;
四:二级指针和多级指针:
一级指针作为存放地址的变量,所以也会有变量的地址,而存储一级指针变量的地址的指针变量称为二级指针,依次循环下去就形成了多级指针;
int* p = &i; //一级指针
int** pp = &p; //二级指针
int*** ppp = &pp; //三级指针
.......
五:野指针
什么是野指针?
一个指针变量里存的地址是无效的或者是非法的,那么这个指针变量所存的地址就叫做野指针,野指针是怎么形成的呢,
1:指针变量定义后没有初始化,这样的指针变量里的地址值是随机的
2:访问了空间已经释放后的地址