指针的
上次我们简单的介绍了指针的基本概念,要灵活运用指针,那些远远不够,今天我们来讲一下指针的加减运算
- 首先我们要先想明白指针加一到底是怎么加的呢?
int main()
{
int arr[10]={1,2,3};
int *p=arr;//指向arr第一个元素的地址
p++;//?到底怎么加的
*p=10;//将它指向的值变为10
printf("%d,%d",arr[0],arr[1]);
}
我们知道指针加一不外乎三种情况:(1)加一个数组(2)加一个字节(3)加一个数组的格子。
[1] 加一个数组:运用指针的目的就是进行数组运算,一次性加一个数组,那么运算就毫无意义,所以排除;
[2 ] 加一个字节:若数组为int类型的,则一个格子为四个字节,加一个字节表示加1/4个格子,那我们画图来具体说明以下:这样是不是特别麻烦呢,所以聪明的人类是不会选择这种的。
[3] 加一个格子,即加一个数组格子,则arr[0]=10了,是不是很方便呢,所以我们的指针p++是加一个格子。
- 那加一个格子后指针的值变为了多少呢,加减的规则是什么,小编在这里告诉大家规则:
每次指针p++的字节取决于指针的类型,即原来指针的值+(或-)sizeof(指针去掉一个*)乘上要加的数字。那我们来看一下以下的几个例子吧。
# include <stdio.h>
int main()
{
printf("加法\n");
int *p=(int *)1000;//强制转换成了地址,但并不能解引用,只是用一下
int *p1=(int *)0x2010;//注意为16进制,所以要按照16进制算
printf("%d\n",p+4);//int字节为4,所以为1000+4*4=1016
printf("%d\n",(long*)p+4);//long 4字节,1000+4*4=1016
printf("%d\n",(short*)p+4);//short 2字节,1000+2*4=1008
printf("%d\n",(char**)p+4);//char*为指针 4字节,1000+4*4=1016
printf("%d\n",(char*)p+4);//char 1字节,1000+4*1=1004
printf("%d\n",(long long)p+4);//没有指针,所以直接加数字 4,1000+4=1004
printf("减法\n");
printf("%x\n",p1-2);//16进制中10即为16,所以16-2*4=8,所以为2008
printf("%x\n",(char*)p1-2);//16-2*1=14,在16进制为200e
printf("%x\n",(double*)p1-2);//16-2*8=0,所以为2000
printf("%x\n",(unsigned long *)p1-2);//unsigned只是表示无符号整形不影响,所以16-2*4=8,为2008
printf("%x\n",(short*****)p1-2);//依旧为指针,所以16-2*4=8,为2008
printf("%x\n",(unsigned int)p1-2);//无指针,所以直接加减即可16-2=14,在16进制为200e
return 0;
}
相信大家现在对指针的知识更深入一步了吧!