函數簽名中的陣列長度:語法好奇心
儘管C 和C 中的函數簽名中明顯存在數組長度,但這些長度被有效地忽略。這種行為讓開發人員感到困惑,並引發了對其用途的疑問。
陣列長度控制的錯覺
考慮以下C 程式碼片段:
#include <stdio.h> int dis(char a[1]) { return strlen(a); } int main() { char b[4] = "abc"; int c = dis(b); printf("%d\n", c); return 0; }
在此程式碼中,dis 函數需要一個長度為1 ([1]) 的字元數組。然而,使用者傳遞了一個長度為 4 (b) 的陣列。令人驚訝的是,程式碼編譯並執行時沒有出現任何錯誤。這表示函數簽章中指定的陣列長度並未強制執行。
陣列傳遞的真實本質
在 C 和 C 中,陣列不是按值傳遞的。相反,傳遞的是指向數組第一個元素的指標。因此,函數簽章中數組長度的規範變得多餘,因為此資訊可以從指標中導出。
歷史原理
允許的決定函數簽名中的數組長度規範是在 C 的早期制定的,這可能是由於早期語言的遺留問題。儘管出於相容性原因保留了此語法,但它已成為開發人員困惑的根源。
結論
C 和 C 函數簽章中存在數組長度是一個語法怪癖,實際上並沒有強制數組長度。此行為是由於底層傳遞機製造成的,該機制涉及指向數組元素的指標而不是數組本身。雖然這種語法似乎沒有必要,但它的歷史淵源已經鞏固了它在現代 C 和 C 程式語言中的地位。
以上是為什麼 C 和 C 函數簽章中的陣列長度似乎被忽略?的詳細內容。更多資訊請關注PHP中文網其他相關文章!