一、一維陣列
1、在記憶體空間上的存放
示例:對於int a[100],在記憶體中占用100×4=400位元組空間;對於char c[100]佔據記憶體空間為100位元組。
2、陣列名
2.1陣列名是什麼?
首先陣列名是陣列的名字,所以陣列名表示該陣列=。=這絕不是廢話,這句話非常有助於後面的理解。
其次,陣列名還能表示什麼?我們都知道,陣列名能表示乙個位址,如何描述該位址,先直接給出答案:陣列名還表示該陣列首元素的位址=。=(依然不是廢話,而是要注意到:是該陣列首元素位址,而不能完全等同於該陣列的首位址,後面會細說)。
2.2陣列名、陣列元素與其取位址的關係
看乙個具體例子:int a[10];
測試下:
#includeintmain()
三者在數值上相等,那麼三者之間的區別在於什麼呢?
首先看&a和&a[0];
a是乙個陣列,a[0]是陣列的乙個元素。對兩者取位址操作,雖然操作後的數值相同,但兩種位址的指向含義是不一樣的;&a指向陣列單位;&a[0]指向陣列元素單位,兩者的單位不同,大小也不一樣。
說明這裡單位空間的含義,假設x為n位元組大小的資料,那麼&x的含義是(n位元組空間的首位址)。對於int m;則&m表示的是乙個整型資料大小空間(即4位元組)的首位址,(&m+n)表示在m首位址上加n個單位大小的記憶體空間,設&m=0x10000000h;則&m+1=0x10000004h;&m+10=0x10000028h.
那麼在這裡,很顯然a和a[0]大小不同,a的大小是10×4=40個位元組,a[0]大小是4個位元組。具體可以通過(&a+n),(&a[0]+n)進行驗證測試:
#includeintmain()
弄清楚&a和&a[0]之後,繼續回到陣列名a上。
回顧陣列名的兩層含義:
第一層:表示乙個陣列。為何說這麼明顯的一句話不是廢話?因為理解了陣列名是乙個陣列,就很輕鬆可以理解&a:對乙個陣列取位址,而非對乙個陣列元素取位址,這可以幫助理解之前&a和&a[0]的區別。
第二層:表示該陣列首元素的位址。那麼依據之前分析的,(a+n)表示什麼?要看(a+n)表示什麼,首先要看a表示的是什麼,a表示的是首元素位址,那麼該位址空間的單位大小就是陣列元素的大小,則(a+n)表示陣列第n個元素的位址,繼續測試:
#includeintmain()
這裡仍然要重點說一下的是:我認為理解&a和&a[0]的相等性和差異是必要而且從邏輯上是合理的,而對於a的第二層表示位址的含義,無法從邏輯上合理得出,而只能去記住:a作為位址含義時,表示的是陣列首元素位址,而非陣列首位址,並且:陣列名非變數,不能作為左值,不能自增自減。從陣列定義開始,陣列名所表示的位址就已經被固定了,無法修改。
3、指標變數在陣列中的應用
回顧陣列在記憶體中的分布:依次連續的一段空間。並且可以通過下標方式去訪問陣列元素。
對於char c[10];c[0]表示第0個元素,c[i]表示第i個元素。該陣列在記憶體中佔據10位元組空間,如何細化描述這段空間:該陣列在記憶體中佔據10個單元空間,每個單元都是char型資料,為1位元組。
char *pc=c;
容易理解:pc+n指向第n個元素,即*(pc+n)==a[n];
同時,一樣可以通過對pc的下標來進行訪問元素,對於上例中:p[i]=*(p+i)=a[i]=*(a+i);&p[i]=(p+i)=(a+i)=&a[0]+i;
這裡說明一下:c編譯器當遇見下標時候,比如x[i],先判斷x是否表示乙個位址(陣列名或取位址運算或指標型別均可),再判斷x是乙個指向什麼型別的位址(通過判斷型別,來得出單位長度);通過上面兩步,設x指向型別單位長度為m,把下標形式轉換為(x+i*m)來進行定位。
再引申:
(1)char *pc=c可以替換為char *pc=&c[0]麼?
當然可以。
(2)char *pc=c可以替換為char *pc=&c麼?替換後(pc+n)表示什麼呢?
一樣可以替換,(pc+n)依然表示a[n]的位址。
這裡要注意pc是什麼?pc是字元指標,所以pc表示的單位大小還是字元型,單位元組大小。pc=&c這裡只是賦值運算,只是把&c的數值賦給pc。而pc表示的單位大小仍然為單位元組。所以(pc+n)依然表示a[n]的位址。
乙個關於陣列元素訪問的綜合示例如下:
#includeintmain()
getch();
return0;
}
C指標小結1
c指標小結1 我認為c語言的核心就是指標和對記憶體的操作,而操作記憶體就是由指標實現的,所以說指標真的非常非常重要,在後邊的資料結構的學習中更要用指標,如果你立志要走c系統的開發這條路,那麼你就應當精通指標的各種應用。下面寫一點博主在學習指標時的一點小心得,小體會 僅僅一家之言 在剛學習指標時是真的...
C語言小結1
1 除法運算子 的運算物件可以是各種型別的資料,但是當進行兩個整型資料相除時,運算結果也是整型資料,即只取商的整數部分 如果運算元中有乙個為實型資料時,則結果為雙精度實型資料。如 5.0 10的運算結果為0.5 5 10的運算結果為0 10 4的運算結果為2 求餘數運算子 僅用於整型資料,不能用於實...
C 陣列小結(2)
二 二維陣列 對於乙個n維陣列,其實質上還是乙個一維陣列,這個一維陣列的每個元素又都是乙個 n 1 維陣列。以此類推。複雜的不去深究,就看二維陣列a m n 實質是乙個由m個元素組成的一維陣列,每個元素又都是含n個元素的一維陣列,這個二維陣列共計m n個元素。對於乙個二維陣列,它實質上是乙個一維陣列...