指標 與 陣列 以及 a 與 &a的區別

Rocky_Ansi發表於2015-11-25
  指標 與陣列 並沒有什麼關係,
 
指標就是指標,指標變數在32位系統下,永遠佔4個byte,其值為某一個記憶體的地址,指標可以指向任何地方,但是不是任何地方你都能通過這個指標變數訪問到;
 
陣列就是陣列,其大小與元素的型別和個數有關,定義陣列時必須指定其元素的型別和個數,陣列可以儲存任何型別的資料,但是不能存放函式;;
 
char *p = "abcdef"; // "abcdef" 放在靜態區;
1) 以指標的形式:*(p+4) 這種形式先取出p儲存的地址值,然後在加上4個字元的偏移量,得到新的地址,然後取出這個新的地址上的值:
2) 以下標的形式: p[4] .  編譯器總是把以下標的形式的操作解析為以指標的形式的操作。p[4]這個操作會被解析成:先取出p儲存的地址值,然後在加上4個字元的偏移量,得到新的地址,然後取出這個新的地址上的值:   
         兩種方式在本質並沒有什麼區別,只是寫法上的不同; 
 
 
a 與 &a 的區別;;

 
 
       int a[5] = { 1, 2, 3 ,4 ,5};
 
       int *ptr = (int *)(&a+1);             // 1 + sizeof(a)    ?20byte?
       printf("%d  %d\n" ,*(a+1) , *( ptr-1)); //  1 sizeof(a[0]) ; //
 
     對指標進行加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1,所以一個型別為T的指標的移動,以sizeiof(T)為移動單位
     &a+1:  去陣列a的首地址,該地址的值加上sizeof(a)的值,即 &a+5*sizeof(int),也就是下一個陣列的首地址,顯然當前指標已經越過了陣列的界限;;
     (int *)(&a+1): 將越出陣列的地址,強制轉化為 int* 型別,賦值給ptr;
     *(a+1):   a 與 &a 的值是一樣的,但意思不一樣,a是陣列首元素的首地址,也就是a[0]的首地址, &a是陣列的首地址。 
       a+1是陣列下一元素的首地址,即a[1]的首地址,    所以輸出2;;//   
       &a+1是下一個陣列的首地址,   //
 

相關文章