作為c語言的特色,也可以說是精華,指標實質名歸!另一大組成部分--陣列,總是和指標糅合在一起操作記憶體,不得不提的是c語言的難點就是記憶體管理,而與記憶體關係最為密切就是陣列和指標,導致初學者學習起來很困難,並且在產生錯誤的時候很難發現錯誤並改正,需要耐心的除錯和檢視變數的值。基於這一點,以下就是本人在學習陣列和指標的時候一些經驗,分享給大家。
一.首先看我在學習這一階段畫的一幅圖
1).指標
(1).指標就是指標,指標變數在32為系統下,永遠佔4個byte.其值為某乙個記憶體的位址,指標可以指向任何地方。
eg:編譯器的bug(vc6.0)
int *p = (int *)ox12ff7c; //這個位址必須是記憶體開始給變數分配位址的第乙個,要不是不會有作用!
*p = null;
p = null;
在執行完第二條語句的時候,發現p的值變成了0x00000000了,為什麼會這樣?就不得不提到vc6.0這個98年的軟體,它在給變數分配記憶體的時候總是從固定的地方開始,哪麼分析一下我們上面的**,定義乙個指標變數,此時,編譯器給指標分配的位址是0x12ff7c,然後給它初始化,將0x12ff7c放到指標變數中,等價於這個指標變數指向自己。當你給指標賦值為null的時候,同樣把指標變數的值也改掉了。這難道真是編譯器的bug麼?答案是否定的。因為你就實現了這樣乙個功能。可以這樣改**:
int i = 10;
int *p = null;
*p = null;
p = null;
就會發現這樣是正常的!需要提的一點是,在其他高版本的編譯器中,不會出現這樣的現象。因為編譯器才分配記憶體的時候,是動態的,不是從固定位置開始。(2).int *p = null 和 *p = null有什麼區別可以在whath中檢視這兩句執行後 p和*p 的值。第一句話的意思是定義乙個整型指標p(其指向的記憶體中存放乙個整型變數)並給它賦初值,既p的值為null,不指向任何位址,此時p的值是0c00000000。第二句話的意思是,是將指標指向的記憶體的值變成0;看一段**:
int i = 10;
int *p = &i;
*p = null;
在編譯器中檢視i的值變成了0;2).陣列(1)陣列就是陣列,其大小是與元素的個數和型別有關係的。定義陣列的時候要給出大小和型別,陣列可以儲存任何資料,函式除外。(2)sizeof 關鍵字eg:
int main()
; printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));//4
printf("%d\n", sizeof(*a));//4
printf("%d\n", sizeof(a + 1));//4
printf("%d\n", sizeof(a[1]));//4
printf("%d\n", sizeof(&a));//4
printf("%d\n", sizeof(&a + 1));//4
printf("%d\n", sizeof(&a[0]));//4
printf("%d\n", sizeof(&a[0] + 1));//4
system("pause");
return 0;
}
陣列名不發生降級的兩種情況,一種是sizeof(a);一種是&a;二.指標和陣列的定義和宣告1).定義為指標,宣告為陣列。檔案1:char * = "abcdefg";檔案2:extern char p;
在檔案1中,編譯器為指標變數分配4個位元組,並命名為p。同時p中儲存了字串常量「abcdefg」的首元素位址。這個字串常量本來是儲存在靜態區,其內容不可以更改。在檔案2中,編譯器認為,p是乙個陣列,其大小為四個位元組,陣列儲存的是char型別的資料。
2).定義為陣列,宣告為指標。
檔案1: char a[100];
檔案2: ectren char *a;
在檔案1中,定義乙個char型別的陣列,大小為100個位元組。可是在檔案2中宣告為指標,只認4個位元組。這裡可以強制型別轉換!
以上就是本人在學習過程中的一些經驗總結。當然,本人能力有限,難免會有紕漏,希望大家可以指正。
本文出自 「做乙個小小小司機」 部落格,請務必保留此出處
理解陣列與指標
int a 10 a本身是陣列名也是指向第乙個陣列元素的指標。a 1是指向第二個陣列元素的指標。也就是說a這個指標的值就是 a 0 a這個指標和a都指向同乙個記憶體位址,但是 a這個指標的意義卻是指向整個陣列,a 1指向a這個陣列結束後的位置。宣告乙個指標指向來指向這個陣列可以這樣宣告 int p ...
深入理解陣列指標與指標陣列的區別
陣列指標與指標陣列的區別在於 陣列指標p是乙個指標,而指標陣列p是乙個存放n個指標變數的陣列。一 陣列指標 int p n 重點 優先順序高 的優先順序是一樣的,但它們的方向是從左至右的,所以先執行括號裡的 p 首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長...
呼叫二維陣列來理解陣列指標與指標陣列
二維陣列 二維陣列可以看作是乙個一維陣列,在本質上是以陣列為陣列元素的陣列。從記憶體空間上看,int a 2 5 和int a 10 同樣占用連續的10個int型空間。陣列指標 一般短語前面做修飾,後面為名詞。陣列指標,顧名思義本質上是一種指標,用於指向陣列的首元素首位址,即叫陣列指標。定義的方法為...