c語言中,陣列需要注意的地方有兩點:
1、c語言中只有一維陣列,陣列大小必須在編譯期就作為乙個常數確定下來,陣列中元素可以是任何型別物件,當然也可以是另外乙個陣列,這樣,要「**」出乙個多維陣列就不是一件難事了;
2、對於乙個陣列,我們只能做兩件事:確定陣列大小,及獲得該陣列下標為0元素的指標,其他關於陣列操作,哪怕看上去是以陣列下表進行運算的,實際上都是通過指標進行的;
我們需要將陣列運算與其對應指標運算融匯貫通,思考相關問題時,對這兩種運算能自動切換。
(1) 宣告乙個陣列:
int a[3];
這句話宣告了a是乙個有3個整形元素的陣列。類似的有:
structb[17];
這句話宣告了乙個擁有17個元素,其中每個元素都是乙個結構,該結構中由乙個擁有4個整形元素的陣列(命名為p)和乙個雙精度型別的變數(命名為x),通過這個例子,可以很直觀的理解第一點,陣列中元素可以是任意型別,但是陣列大小在編譯器就作為乙個常數確定下來。
再看下面乙個例子:
int calendar[12][31];
這個語句宣告了calendar為乙個陣列,該陣列擁有12個陣列型別元素,其中每個元素都是乙個擁有31個整形元素的陣列。因此,sizeof(calendar)為31x12=372。
(2)宣告乙個指標
int *ip;
int i;
ip = & i;
這樣,ip就指向變數i位址,我們就可以通過間接訪問的方式,改變變數i的值
*ip = 17;
如果指標指向的是陣列中乙個元素,我們就可以通過對指標加1或減1,就可以訪問當前元素的後乙個元素或前乙個元素,這樣,如果兩個指標指向同乙個陣列,指標之間的減法就是有意義的,反之,沒有意義。
(3)陣列與指標之間對應關係
如果指標指向陣列的第乙個元素,可以寫成:
p = a;
*(a+i) <==> a[i]
由於a+i和i+a並沒有任何區別,因此,a[i]與i[a]也具有相同含義,但是我們不推薦後一種寫法。
再看一下「二維陣列」,實際上他只是陣列元素為陣列的陣列。
int calendar[12][31];
int *p;
int i;
那麼,我們將calendar的第五個陣列取出來賦值給p有:
p = calendar[4];
i = calendar[4][7];
// i = *(calendar[4] + 7);
// i = *(*(calendar+4)+7) ;
下面兩種表達方式與第一種完全等價,這就是陣列與指標的等價表示。
enjoy!!!
c traps and pitfalls
C指標陣列和陣列指標
測試 int main 定義二維陣列m並初始化 int p 4 陣列指標 p是指標,指向一維陣列,每個一維陣列有4個int元素 int i,j int q 3 指標陣列 q是陣列,陣列元素是指標,3個int指標 p m p是指標,可以直接指向二維陣列 printf 陣列指標輸出元素 n for i ...
c 陣列 和 陣列指標
今天 乙個朋友 面試,面試題如下 int tmain int argc,tchar argv int ptr int a 1 printf d t d a 1 ptr 1 return 0 我覺得 指標 只要 掌握 兩方面資訊 就 沒什麼 可難的了.一是 指標變數 裡 存放的 位址 二是 指標變數 ...
c 指標 和 陣列
include include 指標 就是記憶體位址 記憶體位址 就是指標 指標就是位址,位址就是指標 位址就是記憶體單元的編號 指標變數是存放位址的變數 指標和指標變數是兩個不同的概念 但是要注意 通常敘述會把指標變數簡稱為指標 實際含義不同 void sitch int a,int b main...