一維陣列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 ...