要想了解指针,需要先了解内存和地址。内存里面存的是数据,而地址就相当于每块内存所在的位置,每块内存空间所占八个比特位。指针就是地址。
接下来说说指针变量。那么不得不说说&,也就是取地址操作符了。
int a = 0;
int * p = &a;
这里p就是指针变量,*表明他是一个指针,int表明p指向的是int型变量。所以第二行的代码的意思就是指针变量p指向a的地址。这里需要说明的是指针不管什么类型,在三十二位机器下,都是占4个字节,而在64位机器下,都占8个字节。
那么指针类型有什么用呢?它其实决定指针解引用时访问的内存大小,也决定指针加减的多少。
int b = 0x11223344;
char* c = (char*)&b;//注意这里前后类型要一样
从第一行可以看出只有第一个字节被改变。
void*类型的指针可以接受任意类型的指针,但不能进行解引用和指针的加减运算。
const修饰指针时,放在*左边和右边作用相反,请看以下的。
接下来说指针的运算
我们先说说指针-指针
这里的三就是这两个指针之间的元素。但需要注意的是这两个指针指向的需要是同一大块区域。
进行指针之间的比大小时,也需要达到上面的条件。
接下来介绍野指针。
那么如何规避野指针呢?
1 指针初始化。
2 小心越界访问
3 指针使用前检验有效性,使用后及时置NULL
assert断言
这里当指针不为空指针时,就会报错,并显示错误在哪一行,注意使用时需要加上#include<assert.h>,如果不想使用这个,可以在这个头文件前面定义一个宏NDEBUG。