int main() { int i = 0; int arr[10] = { 0 };//數組的初始化 int*p = arr;//創建一個指向arr的指針 for (i = 0; i < 10; i++)//利用指針的原理對數組進行賦值 { *(arr + i) = i; } for (i = 0; i < 10; i++)//利用數組下標的方式對指針所指向空間進行賦值 { p[i] = i; } for (i = 0; i < 10; i++)//對結果進行驗證 { printf("arr[%d]=%d *(p+%d)=%d\n", i, arr[i], i, *(p + i)); } system("pause"); return 0; }
這份代碼要注意兩點,第一是多個指針可以指向同一塊目標,第二是當數組利用指針原理進行訪問時,其本身發生了降級(C和指針這本書中有講過,解釋什麼是降級並不是很明確),這裡我們首先要明確,指針是指針,並不是數組,創建數組,內存開辟了多個字節(取決於創建大小與所創建的數據類型),而所有指針都只有4個字節,占用一塊內存空間。而所謂數組降級,就是數組名從占用多個地址,變為數組首元素的地址。只有兩種運算時數組不會降級,一個事對數組進行取地址時,如&arr,還有就是調用sizeof函數時數組不會降級。再給個例子:
int main() { int i = 0; int arr[10] = { 0 };//數組的初始化 int*p = arr;//創建一個指向arr的指針 printf("%d ",sizeof(arr)); printf("%d ", sizeof(p)); printf("%d ", sizeof(arr[0])); printf("%d ", sizeof(&arr)); printf("%d ", sizeof(&arr[0])); printf("%d ", sizeof(*&arr)); system("pause"); return 0; }
這份代碼的輸出結果是什麼呢,我們一個一個進行分析,首先int 類型占四個字節 第一個輸出,上文提到過sizeof函數不會使數組降級,所以求的是整個數組的字節,是40 第二個輸出,指針占四個字節,其輸出結果為4 第三個輸出,是求arr[0]的大小,為四個字節,也可以說是對arr進行了下標運算,使arr發生了降級還是4 第四個輸出,取arr的地址,地址,肯定為四個字節 第五個,也是地址,四個字節 最後一個呢,取arr的地址,然後進行解運用,所得還是arr整個數組,在求其所占字節,為40 未完待續