对于一段程序
int *p=arr;//指针指向了数组第一位
*p=10;//将数字10赋值给数组第一位数
p++;
*p=20;//将数字20赋值进去
在这段程序中“p++”有三种可能 1:给其加整个数组
2:给其加一个字节
分析:
1、给其加整个数组后指针就从初始化数组的头部位置直接跳到数组的末尾,进入不了数组内部,改变不了数组的任何一个值因此无意义。
2、给其加一个字节,假设这个数组共有{1,2,3,4,5,6,7,8,9,10}这10个数,其中1的地址为100以此类推,
根据程序将arr[0]赋值成10
然后增加一个字节
此时指针指向的是蓝色格子中的数值将20赋值进去
此时arr[0]==5130 arr[1]==0
因此这种加一个字节的方式在改变数组中的数据总会有其他的数据被覆盖,不方便操作,无意义。
3、指针加以等同于加一个单元格,
对于不同的指针类型所对应的“加上一个单元格“代表加上自己的字节数
即: int *p 整形指针变量 加一个单元格 ==加上4个字节
char*p 字符型指针变量 加一个单元格 ==加上1个字节
。。。 。。。。。。。 。。。。。。。。。。。。。。
因此有:指针算术运算
加指针法需要调整(加1等于一个单元格),调整的权重为指针去掉一个星号,然后求sizeof
即: int *p; p+1 加4个字节=sizeof( int )
double*p; p+1 加8个字节=sizeof( double )
char**p; p+1 加4个字节=sizeof( char* )
指针-指针—>计算单元个数
方法:
1、算数间隔字节数
2、除以权重
eg:
int main()
{
int arr[10]={0};//假设数组首端地址为X
int *p=&arr[1];//p保存了arr[1]的地址”X+4“
int *q=&arr[9];//q保存了arr[9]的地址”X+36“
printf("%d\n",p-q);//-32/4==-8 -32是间隔字节数 4是权重 );//-
printf("%d\n",(char**)p-(char**)q);//8
printf("%d\n",(long long )p-(long long )q);//注意没有*的直接处理。
}