数据类型必须是严格相同的,才可以赋值的。
1.指针的加减数字 指的是指针在数组中的位置移动
2.加减规则:指针加减法需要调整。调整的权重是指针本身去掉一个*号,再求sizeof();
加法示例:
int *p = (int *)1000;
//定义一个整型指针变量p赋值为16进制数0x1000;
printf("%d\n",p+2);//1008
//去掉一个*,属于int型,sizeof(int)是4,即1000+2*sizeof(int) = 1008;
printf("%d\n",(char ***)p+2);//1008
去掉一个*,为char**,二维指针,sizeof()为4,1000+2*4 = 1008;
printf("%d\n",(short *)p+2);//1004
去掉一个*,属于short型,sizeof()为2,1000+2*sizeof(short) = 1004;
printf("%d\n",(double **)p+2);//1008
去掉一个*,还是指针变量,sizeof()为4,1000+2*4 = 1008;
printf("%d\n",(unsigned long *)p+2);//1008
去掉一个*,属于unsigned long,sizeof()为4,1000+2*sizeof(unsigned long) = 1008;
printf("%d\n",(char *)p+2);//1002
去掉一个*,属于char型,sizeof()为1,1000+2*sizeof(char) = 1002;
printf("%d\n",(unsigned long long)p+2);//1002
不是指针变量,不用求sizeof,直接1000+2 = 1002;
减法示例:
//定义一个整型指针变量p赋值为16进制数0x1000;
int *p = (int *)0x2010; //转换为二进制该数10两位是16
printf("%x\n",p-2);//2008
//去掉一个*,属于int型,sizeof(int)为4,那么为2016-2*sizeof(int)=2008;
printf("%x\n",(float *)p-2);//2008
// 去掉一个*,属于float型,sizeof(float)为4,那么2016-2*sizeof(folat) = 2008
printf("%x\n",(double *)p-2);//2000
//去掉一个*,属于double型,sizeof(double)为8,2016-2*sizeof(double) = 2000
printf("%x\n",(short *)p-2);//200c
//去掉一个*,属于short型,sizeof(short)为2,2016-2*sizeof(short) = 200c
printf("%x\n",(unsigned long *)p-2);//2008
//去掉一个*,属于unsigned long型,sizeof()为4,那么2016-2*4 = 2008;
printf("%x\n",(long *)p-2);//2008
去掉一个*,属于long型,sizeof(long)为4,那么2016-2*sizeof(long) = 2008
printf("%x\n",(long long)p-2);//200e
其不是指针变量,所以直接2016 - 2 = 2014,十六进制用200e表示
printf("%x\n",(char *)p-2);//200e
去掉一个*,属于char型,sizeof(char)为1,2016-2*sizeof(char)=200e;
指针+指针是非法的
指针-指针:
//指针-指针:间隔的单元个数,需要调整,调整的权重位sizeof(指针去掉一个*)
//指针-指针的计算:1、计算间隔的字节数,2、除以权重
int arr[10] = {0};
int *p = &arr[1];//x+4
int *q = &arr[7];//x+28
printf("%d\n",p-q);//-6
p-q的间隔字节数为-24,-24/sizeof(int) = -6
printf("%d\n",q-p);//6
q-p的间隔字节数为24,24/sizeof(int)= 6
printf("%d\n",(short *)q-(short *)p);//12
q-p的间隔字节数为24,24/sizeof(short)= 12
printf("%d\n",(long long*)q-(long long *)p);//3
q-p的间隔字节数为24,24/sizeof(long long )= 3
printf("%d\n",(double *)q-(double *)p);//3
q-p的间隔字节数为24,24/sizeof(double)= 3
printf("%d\n",(unsigned long)q-(unsigned long)p);//24
其不是指针变量,直接q-p即可,即答案为24;
printf("%d\n",(char **)q-(char **)p);//6
q-p的间隔字节数为24,去掉一个*,char*为指针变量,占有4个字节,即24/4 = 6;