一、指针的加法
首先给一串关于指针加法的代码:
#include <stdio.h>
//指针算术运算
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int *p = arr;
*p = 10;
p++;
*p = 20;
printf("%08x,%08x\n",arr[0],arr[1]);
return 0;
}
首先联想到可能会有三种情况:
(1)加一个字节
(2)加一个单元格长度
(3)加整个数组
1.加一个字节(不这样使用)
对于增加一个字节,我们需要改变一下代码
#include <stdio.h>
//指针加一个字节的运算
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int *p = arr;
*p = 10;
p = (int *)((int)p+1);
*p = 20;
printf("%08x,%08x\n",arr[0],arr[1]);
return 0;
}
假设arr数组首地址为100,则
arr[1]的地址为100-103
此时地址存储数据为0x01 00 00 00(16进制,为方便中间用空格隔开,地址的存储形式为小端)
arr[2]存储的地址为104-107
此时地址存储数据为 0x02 00 00 00
用十六进制输出如下图:
使用指针并将它赋值为10
它的地址为101 102 103 104
地址存储数据为0x0a 00 00 00
用十六进制输出如下图:
当指针增加一字节的时候,指针的指向的地址更改为101,如果这时使用指针,它会自动从指针指向的首地址顺序找寻共四个字节长度大小的数据作为int型数据
此时它的地址为101 102 103 104
存储数据为0x00 00 00 02
现在改变指针内存储的数据,即*p = 20
此时存储数据变了为0x14 00 00 00
即100-108的存储数据为
0a 14 00 00 00 00 00 00
此时输出arr[0]和arr[1]就变成了
但是这样使用指针非常不方便
2.加一个单元格
这种情况最容易接受,即指针的加法就是加一个单元格。
单元格长度为sizeof(指针去掉一个*)的字节长度。
当指针增加的时候进行调整,调整的权重为sizeof(指针去掉一个*)的字节长度,此时指针的增加就是一个单元格长度
此时最上面的代码输出为:
3.加整个数组
如果增加整个数组则无法使用,所以这种情况不成立。
二、指针的减法
指针的减法类似与指针的加法,指针的减法就是减去一个单元格。
单元格长度为sizeof(指针去掉一个*)的字节长度。
当指针减法的时候进行调整,调整的权重为sizeof(指针去掉一个*)的字节长度,此时指针的减去的就是一个单元格长度。
三、指针+指针
这种情况无意义。
四、指针-指针
指针-指针所的结果不是字节数,而是间隔的单元格数。
间隔单元格数计算步骤为:
1)算出间隔的字节数
2)用字节数除以调整的权重
即指针的所有算术运算都需要调整,调整的权重为sizeof(指针去掉一个*)