在c語言中,指標是一種型別,存放的是位址,例如char*p,這裡p存放的是字元型資料的位址,int*p,p存放的是整形資料的位址,我們可以通過解運用*來獲取該位址所指向的內容。而陣列則是一種資料型別的集合,如int arr=;這裡宣告與定義了乙個整形陣列,而char arr="hello world";則是宣告與定義了乙個字元型別的陣列,這個陣列內存放的是乙個字串。
c語言規定,在大多數情況下陣列名其實質就是陣列元素的首位址,所以我們可以通過運用指標的方式來訪問陣列,或者用陣列下標的方式來訪問指標所指向的內容,注意,這裡時所指向的內容,並不是指標本身。舉個例子:
int main()
;//陣列的初始化
int*p = arr;//建立乙個指向arr的指標
for (i = 0; i < 10; i++)//利用指標的原理對陣列進行賦值
for (i = 0; i < 10; i++)//利用陣列下標的方式對指標所指向空間進行賦值
for (i = 0; i < 10; i++)//對結果進行驗證
system("pause");
return 0;
}
這份**要注意兩點,第一是多個指標可以指向同一塊目標,第二是當陣列利用指標原理進行訪問時,其本身發生了降級(c和指標這本書中有講過,解釋什麼是降級並不是很明確),這裡我們首先要明確,指標是指標,並不是陣列,建立陣列,記憶體開闢了多個位元組(取決於建立大小與所建立的資料型別),而所有指標都只有4個位元組,占用一塊記憶體空間。而所謂陣列降級,就是陣列名從占用多個位址,變為陣列首元素的位址。只有兩種運算時陣列不會降級,乙個事對陣列進行取位址時,如&arr,還有就是呼叫sizeof函式時陣列不會降級。再給個例子:
int main()
;//陣列的初始化
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
未完待續
本文出自 「pawnsir的it之路」 部落格,請務必保留此出處
C語言中的陣列指標與指標陣列
一 指標陣列和陣列指標的記憶體布局 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下...
詳解C語言中的陣列指標與指標陣列
詳解陣列指標與指標陣列 陣列指標 一 區分 首先我們需要了解什麼是陣列指標以及什麼是指標陣列,如下圖 int p 5 int p 5 陣列指標的意思即為通過指標引用陣列,p先和 結合,說明了p是乙個指標變數,指向乙個大小為5的陣列。所以,int p 5 即為乙個陣列指標。int p 5 則是乙個大小...
C語言中的陣列 指標陣列 陣列指標
1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...