“指针+1”的理解
1、一個32位的機器,該機器的指針是多少位的?
指針是多少位只要看地址總線的位數就行了,80386以后的機子都是32的地址總線,所以指針的位數就是4個字節了。
2、指針加1,結果是對該指針增加1個儲存單位。
(1)“存儲單位”,指的是指針指向的數據類型所占的內存的字節數。不同類型的指針加1后,增加的大小不同。
(2)例子
int main(void) {int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf(“%d,%d”,*(a+1),*(ptr-1));return 0; }此時的輸出是2,5。解釋:*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5。
? ? ? ? ? ? &a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)
? ? ? ? ? ? int *ptr=(int *)(&a+1),則ptr實際是&(a[5]),也就是a+5
? ? ? ? ? ? &a是數組指針,其類型為 int (*)[5],a是長度為5的int數組指針,所以要加 5*sizeof(int),所以ptr實際是a[5];
? ? ? ? ? ? 但是prt與(&a+1)類型是不一樣的(這點很重要,prt指向的是整形),所以prt-1只會減去sizeof(int)
? ? ? ? ? ? a,&a的地址是一樣的,但意思不一樣:
? ? ? ? ? ? a是數組首地址,也就是a[0]的地址,a+1是數組下一元素的地址,即a[1],
? ? ? ? ? ? &a是對象(整個數組作為一個對象)首地址,而&a+1是下一個對象的地址,即a[5].
總結
- 上一篇: 钉钉日志范文100篇_钉钉工作日记(模板
- 下一篇: 英文java简历模板下载_java软件工