陣列名作為函式傳遞時的一些有趣現象

2021-08-15 13:15:15 字數 1690 閱讀 1446

最近在學習陣列的過程中,遇到了一系列的陣列名作為函式引數的問題,並發現了很多有趣的現象。

1.

char test(char string)

(請先忽略掉return)

很明顯,是我們的 函式的  形式引數  的型別與函式體中表示式所要「使用「的型別不同。我們往往心裡知道,在呼叫函式時傳遞給函式的是乙個陣列,但實際上,我們定義的(char string)並不是陣列,而僅僅是乙個「char」型變數。

我們可能想在main中這樣做:

int main()

; printf("%c\n", test(a));

return 0;

}char test(char string)

此時的錯誤資訊是這樣的:

很明顯,實參(char a=...)是乙個字元陣列,也可以叫做「char *」型陣列;而形參(char string)則是乙個字元型「char」型變數。

所以,儘管我們心裡知道string 是乙個陣列,並在呼叫時也確實將陣列型的實參傳遞給它,但計算機並不這麼認為。

計算機需要更為精確的說明。

2.

char test(char string);

int main()

;

printf("%c\n", test(a));

return 0;

}char test(char string)

那好,既然形參實參兩者的型別不同,那麼我就在函式的形參中定義乙個陣列:char string[256];

現在編譯完全ok,那麼執行結果會是什麼呢?

結果是a。事實上這樣返回的是乙個a[0]元素。

那麼,將函式改為:

char test(char string)

結果如何呢?

結果仍然是a,並沒有改變。

所以在此情形中,return 0,既是返回到實參陣列的第乙個元素。至於return 1,2,3,4..是什麼大家可以自己試試。

int test(int string);

int main()

; printf("%d\n", test(a));

return 0;

}int test(int string)

但將程式全部改為int型時,輸出又有點不同:

輸出的都是 return n ,n的值。

所以由此可見,在傳值呼叫函式到最後離開函式時,真正有作用的值,是return 到的那個值。

正確的寫出return 值  和   匹配實參形參的型別,是在編寫函式及呼叫函式時必須的。

陣列名作為函式引數時,退化為指標

陣列名作為函式引數時,退化為指標 func char str 100 函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是乙個指標 在失去其內涵的同時,它還失去了其常量特性,可以作自增 自減等操作,可以被修改。陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址 在c...

一些有趣的函式

split 函式是用來處理字串的,遍歷字串,當遇到某一標誌時則將字串分割成列表。例如 s jhdj dkdskd s dskdh sdsdk sdksd skd sds kd sd s1 s.split 標誌設定為空格執行結果 jhdj dkdskd s dskdh sdsdk sdksd skd ...

陣列名作為形參時的規則細節 浮點型資料格式符細節

1,形引數組可以不指定大小,在定義陣列時在陣列名後面跟乙個空的方括號。有時為了在被呼叫函式中處理陣列元素的需要,可以另設乙個形參,傳遞需要處理的陣列元素的個數。2,用陣列名作函式實參時,不是把陣列元素的值傳遞給形參,而是把實參陣列的首元素的位址傳遞給形引數組,這樣兩個陣列就占用同一段記憶體單元。in...