根据指针加法可知:
程序员需要通过指针p--来改变数组中数组的值,
指针q--会使指针p向前移动一个单元格,当指针q为整型时,移动四个字节
指针减法,需要调整,调整的权重为sizeof(指针去掉一个*)
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(int *q = &arr[9];q>=arr;q--) //int *q = &arr[9]表示指针p指向数组arr的第10个格子
{ //q--表示指针移位,向前移动一个格子(int型指针,一个格子四个字节)
printf("%d ",*q); //依次输出指针p所指格子的值,将数组arr逆序输出
}
int *p = &arr[7]; //定义指针p,将指针p指向arr数组的第8个格子
*p = 20; //将指针p所指的格子数字改为20,即将arr数组的第8个格子赋值成20
p--; //指针p--,,即将指针p指针向arr数组的第7个格子
*p = 30; //将指针p所指的格子数字改为30,即将arr数组的第7个格子赋值成30
return 0;
}
例题:
int main()
{
int *p = (int *)0x2010; //定义一个指针p指向0x2016,并将0x2016强行转化为int * 型
printf("%x\n",p-2); //int型,四个字节大小,2010-4*2,16-8,输出结果为:2008
printf("%x\n",(short *)p-2); //short型,两个字节大小,2010-2*2;16-4,输出结果为:200c
printf("%x\n",(unsigned long *)p-2); //unsigned长整型,四个字节大小,2010-4*2,输出结果为:2008
printf("%x\n",(long long **)p-2); //long long指针型,四个自己大小,2010-4*2,16-8,输出结果为:2008
printf("%x\n",(float *)p-2); //float型,四个字节大小,2010-4*2,16-8,输出结果为:2008
printf("%x\n",(double *)p-2); //double型,八个字节大小,2010-8*2,16-16,输出结果为:2000
printf("%x\n",(char *)p-2); //char型,一个字节大小,2010-1*2,16-2,输出结果为:200e
printf("%x\n",(unsigned long )p-2); //常量,一个字节大小,2010-1*2,16-2,输出结果为:200e
return 0;
}