c語言高階 多維陣列本質及指標陣列的應用分析

2021-08-20 15:31:04 字數 2667 閱讀 9493

一維陣列int a[10]在做函式引數時會退化為指標int *a,但是二維指標做函式引數時卻不能寫成二級指標,那麼二維陣列的本質到底是什麼,可以通過**來驗證。

int a[3][5], i=0, j=0;//定義乙個3

*5的二維陣列

int tmp = 1;

for (i=0; i<3; i++)

}printf("a %d , a+1:%d ", a, a+1); //輸出陣列首元素位址和步長

printf("&a %d , &a+1:%d ", &a, &a+1); //輸出陣列位址和步長

//輸出結果

//陣列首元素位址與陣列位址相同

//a的步長為20個位元組,&a的步長為15

*4 = 60個位元組

得出結論:

多維陣列名的本質是陣列指標,步長為多維陣列一維的長度

1、c語言中只會以機械式的值拷貝的方式傳遞引數(實參把值傳給形參)

int fun(char a[20])

//輸出結果為4位元組(32位)

原因1:高效

原因2:c語言處理a[n]的時候,它沒有辦法知道n是幾,陣列發生了退化,變為了指標。

2、二維陣列的退化問題

二維陣列可以看做一維陣列的陣列,因此二維陣列中的第一維可以省略。

void f(int a[5]) ====》void f(int a); ===》 void f(int* a);

void g(int a[3][3])====》 void g(int a[3]); ====》 void g(int (*a)[3]);

3、陣列與指標的等價關係

陣列引數                        等效的指標引數

一維陣列 char a[30] 指標 char*

指標陣列 char *a[30] 指標的指標 char **a

二維陣列 char a[10][30] 陣列的指標 char(*a)[30]

在實際的應用開發中,指標陣列主要有選單和命令列兩種應用場景

1、選單應用

//求關鍵字在表中的位置

//乙個入口 多個出口

int searchekeytable(const

char* table, const

int size, const

char* key, int *pos)

//間接的證明 陣列做函式引數的回退

//這裡inum的值為1,因為陣列會發生回退,編譯器並不知道n是多少,當做char **table來看,屬於指標型別四個位元組

inum = (sizeof(table)/sizeof(*table));

for(i=0; iif( strcmp(key, table[i]) == 0 )

}//沒有找到返回-1

if (i == size)

return rv;

}#define dim(a) (sizeof(a)/sizeof(*a))

int main()

; searchekeytable( c_keyword, dim(c_keyword),"do", &pos);

//巨集定義部分展開為 sizeof(c_keyword)/sizeof(*c_keyword),計算的是指標陣列的長度

//*c_keyword等價於c_keyword[0] 表示式為4*4/4 = 4

printf("pos:%d\n", pos);

searchekeytable( c_keyword, dim(c_keyword), "static", &pos);

printf("pos:%d\n", pos);

system("pause");

return ;

}

2、main函式命令列應用我們經常發現在main函式中會存在int argc, char* argv這樣的函式引數,那麼這些函式引數時從**傳遞並分配記憶體的嗎,答案是作業系統。如果我們使用命令列工具來執行程式,就可以傳入這些引數。

int main(int argc, char* argv, char**env)

printf("******************* end argv *******************\n");

printf("******************* begin env *******************\n");

for(i=0; env[i]!=null; i++) //為什麼可以正常執行?

printf("******************* end env*******************\n");

}

這裡並沒有傳入env的個數,但是迴圈依然不會發生中斷,原因是main函式會自動在字元陣列後面自動加上結束標誌(null 0 『\0』)

C語言高階 第34課 多維陣列和多維指標(難點)

指向指標的指標 指標的本質是變數 指標會占用一定的記憶體空間 可以定義指標的指標來儲存指標變數的位址值。int main 為什麼需要指向指標的指標?指標在本質上也是變數 對於指標也同樣存在傳值呼叫和傳址呼叫。include include include int reset char p,int s...

C語言多維陣列指標的技巧

最近在學習c下多維陣列指標的時候,發現個小的技巧。比如定義乙個二維陣列,int a 3 4 如果想引用第乙個元素,直接 a,就可以了。當然如果定義三維的陣列,引用第乙個元素,直接 a。多維的照此推理就可以了。如果在程式中使用指向陣列元素的指標變數,對其賦初值時,要使用元素位址,不能使用行的位址。如果...

C語言指向多維陣列的指標

設有整型二維陣列a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定義為 int a 3 4 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a 0 a 1 a 2 ...