最近在學習陣列的過程中,遇到了一系列的陣列名作為函式引數的問題,並發現了很多有趣的現象。
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...