為什麼僅在結構體中支持數組成員賦值
與一般數組不同,結構中定義的數組享受成員賦值。雖然不允許將一個陣列分配給另一個陣列(__
num1 = num2;//
struct1 = struct2; //< ;/pre>__),如下圖:<pre class="brush:php;toolbar:false">int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
歷史和哲學原理
這種差異源自於 C 的演變。在早期迭代中,數組本質上是沒有大小資訊的指標。這阻礙了他們的分配,因為編譯器缺乏必要的數據。然而,結構內的數組受益於特殊的處理,從封閉的結構繼承其類型和大小資訊。因此,它們可以在結構體的上下文中按成員進行分配,而不受一般約束的影響。
這種做法被延續到現代 C 和 C 中,這是一個解決分配開放數組的實作挑戰的怪癖。引入通用數組分配會帶來歧義和相容性問題。因此,限制得以保留,並鼓勵程式設計師使用 memcpy 進行明確數組複製。
異常
函數參數已成為陣列成員可以的另一種設定分配的。考慮以下程式碼:
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
雖然 a 是指標參數,但賦值有效地執行了按元素複製,儘管位於結構之外。此異常本質上是一種增強功能,允許在函數呼叫中使用值語義。
以上是為什麼我不能直接為數組賦值,但可以在 C/C 中的結構體中賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!