首先要簡單介紹一下指標的加減運算,
假設有int a[5]={1,2,3,4,5};
若int *p=&a[0];
p+3的結果並非是a[0]的地址增加3個位元組,而是增加該指標指向元素型別的位元組數的3倍,若在當前大多數的環境中,是3*4=12個位元組。
下面我們來看題目:
a[i]在編譯過程中會被隱式轉換為*(a+i),i[a]同理會被轉化為*(i+a),由於加法的交換律,當然結果一樣了
根據優先順序,[]的優先順序高於&,因此&a[i]相當於&(*(a+i)),即為a+i(即為a[i]元素所在地址)
i[&a]相當於*(i+&a)
注意,a為一存有5個int型別的陣列的第一個元素的地址,也就是說若需要一個指標變數p存放a的地址,該指標的型別應當為int*型,若該指標自增,則其存放的地址增幅應當為sizeof(int),那麼很顯然若有一個指標存放&a,那麼該指標的型別應當為int**型,其指向的目標應當為整個陣列,若該指標自增,其存放的地址增幅應當為sizeof(a)。
那麼顯然,a+i的地址應當是a的地址再加上i個int元素位元組數的地址,i+&a的地址應當是&a的地址(數值上和a的地址是一樣的)再加上i個a陣列位元組數(在本例中為5*4=20)的地址,最後在外面加上間接運算子*,指向的地址雖然未發生變化,但是指向的內容從(int *)變成了int。
第三問同理可得
首先要簡單介紹一下指標的加減運算,
假設有int a[5]={1,2,3,4,5};
若int *p=&a[0];
p+3的結果並非是a[0]的地址增加3個位元組,而是增加該指標指向元素型別的位元組數的3倍,若在當前大多數的環境中,是3*4=12個位元組。
下面我們來看題目:
a[i]在編譯過程中會被隱式轉換為*(a+i),i[a]同理會被轉化為*(i+a),由於加法的交換律,當然結果一樣了
根據優先順序,[]的優先順序高於&,因此&a[i]相當於&(*(a+i)),即為a+i(即為a[i]元素所在地址)
i[&a]相當於*(i+&a)
注意,a為一存有5個int型別的陣列的第一個元素的地址,也就是說若需要一個指標變數p存放a的地址,該指標的型別應當為int*型,若該指標自增,則其存放的地址增幅應當為sizeof(int),那麼很顯然若有一個指標存放&a,那麼該指標的型別應當為int**型,其指向的目標應當為整個陣列,若該指標自增,其存放的地址增幅應當為sizeof(a)。
那麼顯然,a+i的地址應當是a的地址再加上i個int元素位元組數的地址,i+&a的地址應當是&a的地址(數值上和a的地址是一樣的)再加上i個a陣列位元組數(在本例中為5*4=20)的地址,最後在外面加上間接運算子*,指向的地址雖然未發生變化,但是指向的內容從(int *)變成了int。
第三問同理可得