-
指针 + 数字:需要调整,调整的权重为 sizeof(指针去掉一个*) 指针 + 1 即指针 + +;
-
指针 - 数字:需要调整,调整的权重为 sizeof(指针去掉一个*) 指针 - 1 即指针 - -;
- 指针 + 指针:非法
- 指针 - 指针 :表示两指针之间间隔的单元格个数,需要调整,调整的权重为sizeof(指针去掉一个*),计算方法如下:
①计算间隔的字节数
②除以权重
以指针加数字为例:(指针减数字类似)
int *p1;
p1++; //加的值为sizeof(int),即加4字节
p1+3; //加3个单元格,p1为int型4字节,即加12个字节
short *p2;
p2++; //加sizeof(short),加2字节
是不是懂了呢?接下来多来点例子看看吧。(我们将数组arr的首元素地址设为x)
int main()
{
int arr[10] = { 0 }; //设&arr[0]为x
int *p = &arr[1]; //x+4
int *q = &arr[7]; //x+28
printf("%d\n", p - q); //-6
printf("%d\n", q - p); //6
printf("%d\n", (short *)q - (short *)p); //12
printf("%d\n", (long long*)q - (long long *)p); //3
printf("%d\n", (double *)q - (double *)p); //3
printf("%d\n", (unsigned long)q - (unsigned long)p); //24
printf("%d\n", (char **)q - (char **)p); //6(去掉一个*求sizeof任然是指针,所以除以4字节)
return 0;
}
打印结果和你想的一样吗?
再来看看~
int main()
{
int *p = (int *)0x2010;
printf("%x\n", p - 2); //2008
printf("%x\n", (float *)p - 2); //2008
printf("%x\n", (double *)p - 2); //2000
printf("%x\n", (short *)p - 2); //200c
printf("%x\n", (unsigned long *)p - 2); //2008
printf("%x\n", (long *)p - 2); //2008
printf("%x\n", (long long)p - 2); //200e,去*后不是指针,不需要调整
printf("%x\n", (char *)p - 2); //200e
printf("///\n");
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(int *p=&arr[9];p>=&arr[0];p--)
{
printf("%d ",*p);
}
return 0;
}
来看看结果:
在做指针运算时一定要注意进制、是否需要调整以及需要调整的权重是多少。