關於指標的加減操作
阿新 • • 發佈:2019-01-02
原題:
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
程式輸出是什麼。
解答:
程式輸出: 2,5
分析:
這裡主要是考查關於指標加減操作的理解。
對指標進行加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1。所以,一個型別為 T 的指標的移動,以 sizeof(T) 為移動單位。
因此,對上題來說,a是一個一維陣列,陣列中有5個元素; ptr 是一個 int 型的指標。
&a + 1: 取 a 的地址,該地址的值加上 sizeof(a) 的值,即 &a + 5*sizeof(int)
(int *)(&a+1):
則是把上一步計算出來的地址,強制轉換為 int * 型別,賦值給 ptr。
*(a+1)
: 輸出2。 分析:a,&a的地址是一樣的,但意思不一樣,a是陣列首地址,也就是a[0]的地址,&a是物件(陣列)首地址,a+1是陣列下一元素的地址,即a[1],&a+1是下一個物件的地址,即a[5]。
*(ptr-1)
: 輸出5。因為 ptr 是指向 a[5],並且 ptr 是 int * 型別,所以 *(ptr-1) 是指向 a[4] ,輸出5。