一、指针+-数字
1、指针+1考虑有三种情况,下面进行每一种情况的分析:
(1) 加整个数组
指针+1若是加整个数组,数组中间的值根本没有被遍历到这样的“+1”是没有任何意义的,数组中间的值没有被用到。
(2) 加一个字节
举一个例子:
#include <stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9};
int *p=a;
*p=10;p=(int *)((char *)p+1);
*p=20;
printf("%08x,%08x\n",a[0],a[1]);
}
整型是4个字节,所以将每个格子扩大4倍。
代码中(int *)((char *)(p+1))表示将p+一个字节,输出时表示运用十六进制输出,所以将10与20转化为十六进制数(PC有为小端)。这种加一个字节比较难以理解,所以一般状态下不使用这种“+1”的方式。
(3) 加一个单元格
举一个例子:
#include <stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9};
int *p=a;
*p=10;
p++;
*p=20;
printf("%08x,%08x\n",a[0],a[1]);
}
代码中p++表示加一个单元格,输出时表示运用十六进制输出,所以将10与20转化为十六进制数,PC有为小端。一般状态下,使用“+一个单元格”这种方式。
经过以上三种情况的你分析,“指针+-数字”即加减一个单元格。
指针+-数字需要调整,调整的权重为sizeof(去掉一个*)
下面举出一些例子:
//指针+数字
int main()
{int *p=(int *)2000;
printf("%d\n",p+4); //2016 //int类型printf("%d\n",(short *)p+4); //2008 //去掉一个*为short类型
printf("%d\n",(double *)p+4); //2032 //去掉一个*为double类型
printf("%d\n",(float **)p+4); //2016 //去掉一个*为一级指针
printf("%d\n",(unsigned short *)p+4); //2008 //去掉一个*为short类型
printf("%d\n",(long *)p+4); //2016 //去掉一个*为long类型
printf("%d\n",(char *)p+4); //2004 //去掉一个*为char类型
printf("%d\n",(unsigned long long)p+4); //2004 //直接将p赋值成long long类型return 0;}
//指针-数字
int main()
{
int *p=(int *)0x2010;
printf("%x\n",p-2); //2008 //int类型
printf("%x\n",(short *)p-2); //200c //去掉一个*是short类型
printf("%x\n",(unsigned long*)p-2); //2008 //去掉一个*是long类型
printf("%x\n",(long long **)p-2); //2008 //去掉一个*是一级指针
printf("%x\n",(float *)p-2); //2008 //去掉一个*是float类型
printf("%x\n",(double *)p-2); //2000 //去掉一个*是double类型
printf("%x\n",(char *)p-2); //200e //去掉一个*是char类型
printf("%x\n",(unsigned long)p-2); //200e //赋值成long类型
return 0;
}
二、指针-指针
指针+指针相当于4月3日加4月5日不符合逻辑,所以指针+指针不存在。
指针-指针:间隔的单元格数,不是字节数(1.算出字节数 2.除以调整的权重)
下面举一个例子:
//指针-指针int main()
{
int arr[10] = {1};
int *p = &arr[1];//x+4
int *q = &arr[9];//x+36
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)q-(short *)p);//16
printf("%d\n",(double *)q-(double *)p);//4
printf("%d\n",(int ***)q-(int ***)p);//8
printf("%d\n",(char **)q-(char **)p);//8
printf("%d\n",(long)q-(long)p);//32
return 0;
}