说到指针大家可能会认为很难,事实只要我们认真学那就一定会学会!
这篇我主要介绍:
1.指针和指针变量及大小
2.指针的运算
3.void*指针
4.野指针
- 指针和指针变量及大小
那指针到底是什么呢?其实指针==地址==内存单元编号。那怎么得到地址呢?这时候就要用到取地址操作符(&)。我们还需要一个变量来存放地址,这个变量叫指针变量。
那要怎么理解呢?
我们将地址保存起来,以后是要使用的,那怎么使用呢?这时候要用解引用操作符(*)。
大家肯定会好奇指针类型变量的大小是多少呢?
先说结论:32位平台下是4个字节,64位平台下是8个字节。
指针变量大小是和机器有多少位有关的。如果机器是32位,也就是相当有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。64位同理。
- 指针的运算
1.指针+- 整数
p1和p2都指向a的地址所以是一样的,p1指向的是int类型,int类型有4个字节所以加1跳过4个字节。但p2被强制转换char类型,char类型有1个字节所以加1跳1个字节。
结论:指针的类型决定了指针向前或者向后移动多大,这也体现出了为什么大小一样但还有不同类型。
2.指针 - 指针
指针-指针的绝对值指的是两个指针之间元素的个数。两个指针必须指向同一空间。
3.指针的关系运算
指针也可以判断是否相等,也可以进行比较大小等等。
- void*指针
void*是一种特殊类型的指针。可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址。但是也有局限性,void*类型的指针不能直接进行指针的+-整数和解引用的运算。
一般 void* 类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。
- 野指针
野指针,是指向不可用内存区域的指针。造成野指针大概有这三种:
1.指针未初始化。
2.指针越界访问。
3.指针指向空间释放。
野指针是很危险的,所以我们要尽量避免出现野指针。那要怎么避免呢?
1.当要用指针时需要进行初始化,如果暂时用不到可以赋值空指针(NULL)。
2.小心指针越界访问。
3.当指针使用完后要及时置NULL,在指针使用前要检查是否有效。
4.避免返回局部变量的地址。
如果存在错误地方请及时指出,如果还有什么不懂的地方可以私信我,如果觉得不错那就点点赞吧!