#include<stdio.h> int main(){ int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; int *p,*q; p = a; q = &a[2]; int c = a[q-p]; printf("value c = %d/n",c++); printf("value c = %d/n",c); return 0; }
答案:c++
value c = 2/nvalue c = 3/n數組
解析:函數
此處q-p=2,容易錯,地址相減得除以類型,表面上差了8,實際上差了2。不一樣類型的地址,好比char *p,額int *p,p-q不能操做,報錯。spa
#include<stdio.h> int main(){ int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return 0; }
答案:code
2,5blog
解析:io
a表示數組首元素地址,即&a[0],該地址偏移大小爲sizeof(int),而&a表示結構體的地址,該地址偏移大小爲sizeof(a),即5*sizeof(int),a的類型爲(int*)[5]class
#include<stdio.h> int main(){ int a[5]; printf("%x\n",a); printf("%x\n",a+1); printf("%x\n",&a); printf("%x\n",&a+1); return 0; }
答案:程序
0Xbfe2e100di
0Xbfe2e104
0Xbfe2e100
0Xbfe2e114
解析:
a表示數組首元素地址,即&a[0],該地址偏移大小爲sizeof(int),所以a+1地址爲0Xbfe2e100+sizeof(int) = 0Xbfe2e104;
而&a表示結構體的地址,該地址偏移大小爲sizeof(a),即5*sizeof(int),a的類型爲(int*)[5],所以&a+1地址爲0Xbfe2e100 + 5*sizeof(int) = 0Xbfe2e114(十六進制)