&a+1問題

請先看以下程序:

Q:

若 int a[5];

則 &a+1 的含義是甚麼?

A:

&a+1 不是表示a的地址(設爲Ox0010)加1,變爲0x0011. 由於a爲包括5個int類型的數組,則"&a+1"中的"+1"表示爲相當於"1"個a大小的空間(或成爲偏移),此時&a+1 表示 a[5].

Q:

若 int* ptr = (int*) (&a+1);

則 ptr 含義是甚麼 ?

而 ptr - 1 又表示甚麼 ?

A:

由於&a+1 表示 a[5], 則ptr即爲a[5]。

又 ptr 爲int型的指針,故 "ptr-1"則會減去"1"個int型指針的空間,此時即爲a[5-1]=a[4].

//***************(轉自http://sculibin.bokee.com/5628791.html)**************************************

看下面具體程序:

main()
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);

    printf("%d,%d",*(a+1),*(ptr-1));
}
輸出:2,5

Explanation:
*(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];
而指針加1要根據指針類型加上一定的值,
不同類型的指針+1之後增加的大小不同
a是長度爲5的int數組指針,所以要加 5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+1)類型是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章