int arr[] = {1,2,3,4,5,6,7,8,9,10};
int n = sizeof(arr)/sizeof(arr[0]);
int *p = arr;
int *q = &arr[9];
printf("%d \n",q-p);
char abrr[] = {1,2,3,4,5,6,7,8,9,10};
char nb = sizeof(arr)/sizeof(arr[0]);
char *pb = abrr;
char *qb = &abrr[9];
printf("%d \n",qb-pb);
double adrr[] = {1,2,3,4,5,6,7,8,9,10};
double nd = sizeof(adrr)/sizeof(adrr[0]);
double *pd = adrr;
double *qd = &adrr[9];
printf("%d \n",q-p);
指针做减法运算,得到的结果为:两个地址之间相隔的单元格数。但是,不同类型指针做减法是不合法的。
所以上述代码运行结果:
另外:指针加指针 不合法
指针加减数字:合法。
那么无类型指针呢?
例如:
int a = 10;
void * p = &a;
思考:p++是否合法??
思考:*p = 20;//解引用 给a赋值20 是否合法??
答案是不合法的。项明白了这个就知道了,为什么指针可以做减法运算和自减了,就是因为一个前提:知道指针的类型,int*的指针,那么指针减减就是指针见一的单元格,单元格是4个字节,char*的指针减减,就是一个单元格一个字节。
所以void * ,无类型,做指针减法运算就不知道一个单元格是几个字节了,也就无法运算,所以不合法。
同理,不知道指针的数据类型,也就不知道解引用的数据类型,所以就不能解引用。