我們都知道c語言中的陣列引數會退化為指標,那有沒有想過為什麼呢?由於c語言當初開發是為unix作業系統的,對於作業系統來說效率是非常重要的,當引數傳遞的時候如果拷貝整個陣列執行效率將大大下降而且引數位於棧上,太大的陣列拷貝將導致棧溢位,所以會將陣列名看做常量指標傳陣列首元素位址,其實二維陣列引數同樣存在退化的問題,二維陣列可以看做是一維陣列且每個元素是一維陣列,如下
也就是說我們在向乙個函式傳遞陣列引數的時候,必須提供第一維以外的所有維長度,因為第一維以外的維度資訊用於指標運算,n維陣列的本質一維陣列,元素是n-1維的陣列,對於多維陣列的函式引數只有第一維是可變的
#include
#include
void
test
(int a[
3],int row)
}printf
("\n");
}void
test1
(int b[
3][4
],int n)}}
}int
main
(void),
};int aa[2]
[3][
4]=;
test
(a,2);
test1
(aa,2)
;return0;
}
結果:
sice@sice:~$ ./test1
sizeof(a)
= 4sizeof(*a)
= 1212
3456
sizeof(b)
= 4sizeof(*b)
= 4800
0000
0000
0000
0000
0000
00
可以看出從本質上來說c語言只有一維陣列,sizeof(a)和sizeof(b)為4可以看出a,b是退化成指標,sizeof(*a) = 12是其二維陣列的第一行陣列的長度,sizeof(*b)=48是其三維陣列的第一行的長度也就是二維陣列的長度 陣列引數和指標引數的分析
為什麼c語言中的陣列引數會退化為指標?c語言中只會以值拷貝的方式傳遞引數,本質上還是傳值,傳位址也是傳值,只不過傳的是位址值 當向函式傳遞引數時 將整個陣列拷貝乙份乙份傳入函式 錯 將陣列名看做常量指標傳陣列首元素位址對 c語言以高效為最初設計目標,在函式傳遞的時候,如果將拷貝整個陣列執行效率將大大...
陣列引數 和 指標引數 分析
c語言中只會以值拷貝的方式傳遞引數,傳址呼叫本質上也是對位址值的傳遞。當向函式傳遞陣列時,將陣列名看做常量指標傳陣列首元素位址。c語言以高效為最初設計目標,在函式傳遞的時候如果拷貝整個陣列執行效率將大大下降,因此只傳遞首元素的位址。二維陣列引數同樣存在退化的問題,二維陣列可以看做是一維陣列,二維陣列...
25 陣列引數和指標引數分析
目錄c 語言以高效作為最初設計目標 二維陣列引數中第一維的引數可以省略 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 等價關係 陣列退化後,所退化的指標必須能指向原陣列中...