指標 與陣列 並沒有什麼關係,
指標就是指標,指標變數在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是下一個陣列的首地址, //