指针的算数运输(二)

一、指针+-数字
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;
}
 

总结:指针的所有算术运算都需要调整,调整的权重为sizeof(指针去掉一个*)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值