陣列作為函式引數 自動轉換為同型別指標

2021-09-30 06:40:34 字數 980 閱讀 8650

高質量c++程式設計指南中指出當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標,這句話針對一維陣列是正確的(目前個人認為是正確的),但是對於多維陣列,這顯然不完全正確。c語言之所以把陣列形參當作指標是出於效率考慮,如果把乙個陣列全部拷貝這樣勢必帶來效能上的損失。所以目前無論你在函式宣告中像'void func1(char a)'這樣寫,還是像'void func1(char *a)',編譯器都會把它看成後者的形式。

所以對於乙個常考的筆試題目:

void f(char a)

{cout《二維陣列作為引數後的轉化還是有原則可循的。就是使得在子函式中仍然可以識別出陣列行的長度。

(1) char a[m][n] -- void func(char (*p)[n]); 也可以寫成void func(char p[n])(編譯器自動將char p[n]翻譯為char (*p)[n]),所以這個時候sizeof(p)=4;sizeof(*p)為n;//注意不是4哈。。。

(2) char *a[n] -- void func(char *p);也可以寫成void func(char **p) ,這個時候sizeof(p)=4,sizeof(*p)=4;

(3) char (*a)[n] -- void func(char (*p)[n]);這個時候sizeof(p)=4,sizeof(*p)=n;

(4) char **a -- void func(char **p);

其實2是一維陣列的情況,3是一維陣列指標,4是二級指標傳遞。

上面的*和可以互換的,寫成p的情況可以換為*p,*p可以換為p,

當可以寫為p的情況下,在中寫入任何數情況下都不會對程式構成影響。編譯器會將這種情況都轉換為*p的情況。

總的原則就是,當你把陣列名傳入是必須讓計算機可以識別出行的長度(陣列為二維的情況下)。三維的情況類似,找到規律,所有情況都可以迎刃而解。

注:上面列舉的所有情況均在vc6.0下測試通過。

文章出處:飛諾網(www.firnow.com):

陣列作為函式引數

一 一維陣列名作函式引數 用陣列名作函式引數,應該在主調函式和被調函式分別定義陣列,例如 void main 在被呼叫函式中宣告了形引數組的大小為10,但在實際中,指定其大小是不起任何作用的,因為c語言編譯對形引數組大小不做檢查,只將實參陣列的首元素位址傳給形引數組。形引數組可以不指定大小,在定義陣...

陣列作為函式引數

陣列元素的作用與變數相當,一般來說,凡是變數可以出現的地方,都可以用陣列元素代替。陣列名也可以做實參和形參,傳遞的是陣列第乙個元素的位址。陣列元素可以用作函式實參,但是不能用作形參,因為形參是在函式被呼叫時臨時分配儲存單元的,不可能為乙個陣列元素單獨分配儲存單元 陣列是乙個整體,在記憶體中佔連續的一...

陣列作為函式引數

做題遇到乙個陣列傳參,發現了一些小問題。1.對於陣列長度來說,用sizeof 陣列名 求出來的並不是陣列的大小,確切的說,不是我要的大小,他是求出了陣列所佔空間的大小。int a 5 int n sizeof a 這樣算出來的n不是想象中的陣列長度5,我得出的結果是20,因為乙個元素佔4個位元組,5...