指针和整数的运算:
我们先来看如下的代码
![](https://i-blog.csdnimg.cn/blog_migrate/ab13e8a8baa15ea357412300a4be3e7e.png)
我们可以发现当指针类型为char类型的时候,加减运算对指针中存放的地址加减了1个字节,然后指针类型为int类型的时候,加减运算对指针内存加减四个字节
也就是 pc的地址+n=pc的地址+n*sizeof(pc的类型的大小)
总结:指针的类型决定了指针向前或者向后走一步有多大(距离)。
指针减指针:
其实就相当于地址减去地址,但做此种运算有一个大前提:
那就是:
两个指针要指向同一块空间.
指针的类型是一致的.
![](https://i-blog.csdnimg.cn/blog_migrate/b428a2aa8201067f3360e3d21c84b94d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/839ac188c83e4d11a9d2414d066c5fdf.png)
指针减去指针其实得到的是指针和指针之间的元素个数
3.指针的关系运算:
![](https://i-blog.csdnimg.cn/blog_migrate/b136659f6e0b12bf88ada497bcaec1cc.png)
上述代码的运行逻辑如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/497711c9625839520dcdc63301329875.png)
虽然指针越界了,但是因为我们没有访问越界里面的数据并没有造成非法访问,所以不会报错。
这个时候有些人可能会有疑惑既然可以从前往后去读取,那能不能从后往前去读取呢?
答案是:建议最好不要这么做
因为标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。
也就是不允许与下标为0的元素之前比较