1. 程式人生 > >關於指標的加減操作

關於指標的加減操作

原題:

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)

,也就是 a[5] 的地址,顯然當前指標已經越過了陣列的界限。
(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。