1.指针加法:加几就是加几个单元格
指针加法需要调整,调整的权重是指针本身去掉一个 * 号,再求sizeof()
int *p ; p+1 就是要加4(sizeof(int)*1)个字节
double *p; p+2就是加8(sizeof(double)*2)个字节
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
*p=10;
p++; //相当与p+1,加4个字节,因为int *去掉* 是int,占四个字节
*p=20;
printf("%d,%d\n",arr[0],arr[1]); //10,20
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
*p=10;
p++; //相当与p+1,加4个字节,因为int *去掉* 是int,占四个字节
*p=20;
printf("%d,%d\n",arr[0],arr[1]); //10,20
int *p = (int *)10000;
printf("%d\n",p+1); //10004
printf("%d\n",p+4); //10016
printf("%d\n",(char *)p+4); //10004 1*4
printf("%d\n",(short *)p+4); //10008 2*4
printf("%d\n",(double *)p+4); //10032 8*4
printf("%d\n",p+1); //10004
printf("%d\n",p+4); //10016
printf("%d\n",(char *)p+4); //10004 1*4
printf("%d\n",(short *)p+4); //10008 2*4
printf("%d\n",(double *)p+4); //10032 8*4
printf("%d\n",(double **)p+1); //10004 去掉一个* 变成double *,是一个指针,加四个字节
printf("%d\n",(unsigned long long )p+1); //10001 强转成一个数,不是指针了,数字加一就好
printf("%d\n",(int ***)p+1); //10004 去掉一个*后,是int **,是一个指针,加四个字节
return 0;
}
printf("%d\n",(unsigned long long )p+1); //10001 强转成一个数,不是指针了,数字加一就好
printf("%d\n",(int ***)p+1); //10004 去掉一个*后,是int **,是一个指针,加四个字节
return 0;
}
2.指针减法:减几就是减几个单元格
指针减法也需要调整,调整的权重和加法一样,指针本身去一个* 号,再求sizeof()
int main()
{
int *p=(int *)0x1010; //注意是十六进制,涉及到了十六进制的减法
printf("%x\n",p-1); //100c
printf("%x\n",p-2); //1008
printf("%x\n",(short *)p-2); //100c
printf("%x\n",(char *)p-2); //100e
printf("%x\n",(double *)p-2); //1000
printf("%x\n",(float *)p-2); //1008
printf("%x\n",(long long)p-2); //100e
printf("%x\n",(double **)p-2); //1008
printf("%x\n",(char **)p-2); //1008
printf("%x\n",p-1); //100c
printf("%x\n",p-2); //1008
printf("%x\n",(short *)p-2); //100c
printf("%x\n",(char *)p-2); //100e
printf("%x\n",(double *)p-2); //1000
printf("%x\n",(float *)p-2); //1008
printf("%x\n",(long long)p-2); //100e
printf("%x\n",(double **)p-2); //1008
printf("%x\n",(char **)p-2); //1008
return 0;
}
3.指针不能加指针
int *p=(int *)100;
int *q=(int *)110;
p+q ;//error
因为没有意义,就相当与一个月的27号和一个月的二号相加,不知道加出的是什么,因为没有意义,指针加法也是这样,是非法的,因为没有意义
4.指针可以减指针
运算过程:
(1)算出两个指针的间隔的字节数
(2)除以指针的权重,和指针加减数字的算法一样,权重就是去掉一个* 号以后,求sizeof();
int arr[10] = {0};//x
int *p = &arr[1];//x+4
int *q = &arr[9];//x+36
int *p = &arr[1];//x+4
int *q = &arr[9];//x+36
//我们不需要知道具体的地址是多少,因为不管地址是多少,都是相差8*4=32个字节,知道字节就求出第一步了
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)q-(short *)p);//16
printf("%d\n",(char **)q-(char **)p);//8
printf("%d\n",(double *)q-(double *)p);//4
printf("%d\n",(long *)q-(long *)p);//8
printf("%d\n",(char *)q-(char*)p);//32
printf("%d\n",(long long)q-(long long)p);//32
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
printf("%d\n",(short *)q-(short *)p);//16
printf("%d\n",(char **)q-(char **)p);//8
printf("%d\n",(double *)q-(double *)p);//4
printf("%d\n",(long *)q-(long *)p);//8
printf("%d\n",(char *)q-(char*)p);//32
printf("%d\n",(long long)q-(long long)p);//32
(3)不同类型的指针不能相减
printf("%d\n",(int *)q-(short *)p);//error