大家好,这篇博客向大家介绍一些关于指针的知识。
第一部分关于指针初阶的讲解
第一部分初级指针
一: 指针是什么
关于指针是什么,我们需要从32位或64位机器讲起,对于32位机器来说是由32根总线,这里的位也可以理解为比特位也就是4字节,机器通电后每根地址线会有正负两种电性,正点代表1,负电代表0;所以总共有232种可能,也就是232个地址,一个小单元为一个字节,一个字节给对应的的地址,每个字节对应不同的地址。
因此我们就可以知道:
如果在32位机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。
这是关于指针的定义,当然这种比较难以理解。我们换个方式让大家容易知道。
1.1 内存和内存地址:在计算机中,内存是用于存储数据的地方。每个内存单元都有一个唯一的地址,用于标识和访问它。我们可以将内存地址视为存储数据的房间号,而内存单元则是房间中存放的数据。
1.2 指针的定义和作用:指针是一种特殊的变量,它存储了一个内存地址。可以将指针视为存放房间号的盒子,它并不存放数据本身,而是指向存放数据的内存位置。指针的作用是提供了直接访问和操作内存中数据的能力。
因此,我们可以将指针比喻为计算机中的房间号,它允许我们直接访问和操作内存中的数据。
总结指针:
1.3 指针变量是用来存放地址的,地址是唯一标示一个内存单元的。
1.4 指针的大小在32位平台是4个字节,在64位平台是8个字节。
1.5 我们平时所说的指针通常就是指针变量。
二:指针和指针类型
2.1
2.2指针的类型
我们知道在C语言中有着不同的变量类型,例如:整形,浮点型等。那指针有没有类型呢?
准确的说:有的,这里是C语言中所有的指针类型(这里的NULL表示将指针置空,没有指向任何空间)
int *pa=NULL;//表明指针pa是存放int类型变量的地址
char *pc=NULL;//表明指针pc是存放char类型变量的地址
short *ps=NULL;//表明指针ps是存放short类型变量的地址
long *pl=NULL;//表明指针pl是存放long类型变量的地址
float *pf=NULL;//表明指针pf是存放float类型变量的地址
double pb=NULL;//表明指针pb是存放double类型变量的地址
voidp=NULL;//表明指针p是存放void类型变量的地址**
2.3指针变量的移动步数,char类型的指针加1,移动一位,int类型的指针加1,移动4位
2.4指针的解引用
这里虽然都打印0,但是按照上面的例子char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
三:野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1 野指针的成因
3.1指针未初始化
3.2指针越界
2如何规避野指针:
- 指针初始化
- 小心指针越界
- 指针指向空间释放,及时置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
四:指针运算
4.1指针-指针
4.2指针-数组
由代码可知,数组名表示的是首元素的地址。
我们也可以通过指针来访问数组里的元素
五:二级指针
指针变量也是变量,是变量就有地址,存放指针变量的地址就是二级指针;
第二部分,关于指针进阶的一些介绍。
一:字符指针
在前面指针的分类我们已经提到过char*的指针,它的使用方法为。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a306bb21b22d4240a3d4ee9472de2ec6.png#pic_center
同时,字符指针也可以指向一个字符串,当以%s的形式打印的时候,它打印的是整个字符串。
二:指针数组,表示的是存储指针的一个数组。
三:数组指针,表示的是指针一个数组的指针。
四:&arr和arr的区别
但是后面这段代码就能发现他们的不同了
这两段代码就能找到他们的不同了。根据上面的代码我们发现arr和arr+1相差4,而&arr和&arr+1相差40,所以arr和&arr虽然值是一样的,但意义不一样。
因此&arr取的是整个数组的地址,而不是首元素的地址。数组的地址+1,是跳过整个数组的大小。
五:函数指针
首先,我们发现函数它也是有地址的,既然有地址我们就可以用指针变量来存储它的地址,这就有了函数指针来指向这个函数。
这里就是一个函数指针的使用。
六:函数指针数组
函数指针数组是一个数组,数组中的每个元素为函数指针;它的经典使用就是模拟简易版计算机的作用。
七:最后一个了,指向函数指针数组的指针。
以上就是关于C语言里的指针部分了,一些没讲好的地方或者讲错的地方希望大家指正。
时人不识凌云木,值待凌云始道高。衷心希望大家能把C语言学好。