今天要记录一个很重要的知识点那就是指针加减一个数和指针加减指针。
1、指针 + 一个数 √
2、指针 - 一个数 √
3、指针 + 指针 ×
4、指针 – 指针 √
由上图可知,指针加指针是不可行的。
1、指针加减数
那指针加减一个数表示什么意思呢,若加的数字为n,则它的意思为加n个单元格,但是他需要调整,调整的权重为sizeof(指针去掉一个*)
练习如下:
(1)加法:
int *p = (int*)2000; 答案
printf("%d\n",p+4); //2016
printf("%d\n",(short *)p+4); //2008
printf("%d\n",(double *)p+4); //2032
printf("%d\n",(float **)p+4); //2016
printf("%d\n",(unsigned short*)p+4); //2008
printf("%d\n",(long *)p+4); //2016
printf("%d\n",(char *)p+4); //2004
printf("%d\n",(unsigned longlong)p+4); //2004(并非指针)
(2)减法:
int *p = (int*)0x2010; 答案
printf("%x\n",p-2); //2008
printf("%x\n",(short *)p-2); //200c
printf("%x\n",(unsigned long*)p-2); //2008
printf("%x\n",(long long **)p-2); //2008
printf("%x\n",(float *)p-2); //2008
printf("%x\n",(double *)p-2); //2000
printf("%x\n",(char *)p-2); //200e
printf("%x\n",(unsigned long)p-2); //200e
2、指针-指针
指针-指针表示的是他们两个指针之间的格子数。我们首先要算出两个指针之间的字节数,再除以调整的权重。
练习如下:
intarr[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
综上所述,指针的所有算术运算都需要调整,调整的权重为sizeof(指针去掉一个*)。