行置換在用C
回答
隨着你的定義A
和B
,分配A[5] = B[4];
是非法的。
可以很容易地通過替換每個元件一個一個
for (size_t i = 0; i < 10; i++) A[5][i] = B[4][i];
或,假設陣列是相同的基本類型的,使用memmove()
(或memcpy()
因爲數組不重疊)
#include <string.h>
memmove(A[5], B[4], 10 * sizeof B[4][0]);
// memcpy(A[5], B[4], 10 * sizeof B[4][0]);
數組不可分配,所以你不能這樣做。
你有2種選擇:
- 循環通過陣列和單獨分配的每個元素。或
- 您可以使用
memcpy
或memmove
。這是可能的,因爲陣列,保證是在內存中連續這樣
您不能分配在C數組類型所以你要麼複製件明智的,或使用memcpy
。
你不允許像這樣直接拷貝C數組,但是有一個解決方法。你可以換裏面struct
struct int_array_10 {
int x[10];
};
struct int_array_10 A[10];
struct int_array_10 B[10];
int main() {
A[5] = B[4]; // this works
}
這編譯和正確的陣列。但它可能有點不方便,因爲您知道必須使用類似A[3].x[4]
而不是A[3][4]
來訪問元素。也許你會定義一個宏訪問相反,允許讀取和更方便地寫元素:
#define get(a,X,Y) (a[X].x[Y])
,你可以使用此類似:
get(A,3,4) = get(B,7,8);
C沒有真正的多維數組類似於一些其他語言。
C有數組數組。
在此聲明
int a[8][12];
a
是int
陣列12的陣列8。
所以a[0][0]
是int
類型和a[5]
是int
類型的排列12的類型。
a[5]
是一個數組,它不能用作賦值運算符的左操作數。 C將數組視爲二級公民,並且不能分配數組。
Ç說(從C99標準中引用):
(6.5.16p2) 「的賦值操作員有修改的左值作爲 其左操作數」
和
( 6.3.2.1p1)「一個可修改的左值是沒有陣列類型的左值,[...]」
要複製數組對象,使用方法是使用memcpy
函數。
downvoter,你能解釋爲什麼你downvoted? – ouah 2012-01-08 16:36:50
(我不是downvoter)也許他們對「C沒有真正的多維數組」的陳述有異議。在像這樣的例子中,在編譯時已知維數的情況下,我認爲多維數組在C語言中工作得很好。例如,ith int a [8] [12];'沒有間接指針查找需要。 [另外,你並不是唯一一個得到贊同的答案,並不是不正確的:-)] – 2012-01-09 13:41:24
@AaronMcDaid感謝您的評論。這也是我的猜測。實際上,我在*多維數組*之前將* real *這個詞放在答案中,以防止那些因爲這個陳述而倒下的人;) – ouah 2012-01-09 20:18:46
- 1. 使用memcpy問題進行C置換
- 2. 在運行時切換App.Config設置C#
- 3. 如何置換用C
- 4. 交換位置用C
- 5. 在C++中的k置換
- 6. 忽略換行符用C
- 7. 替換換行符char(10)在objective-c
- 8. 如何更改Unix行換行到Windows行換行使用C#
- 9. C++ OutputDebugStringW換行
- 10. 行/列置換
- 11. 在文件末尾插入換行符的Visual C++設置
- 12. 組合設置,清除並在一行中切換C
- 13. 設置編碼,換行,換行,結束行(EOL)在PHP
- 14. Python - 在文件輸出中用換行/換行換行換行
- 15. C#DataGridTextColumn換行符
- 16. C#用位置替換字符串
- 17. 在C++中的置換計算
- 18. 在C++中創建向量的置換
- 19. 轉換字符在C#中設置
- 20. 如何在執行方程時使用C++開始換行
- 21. C#中的置換算法
- 22. 用C89替換C++單行註釋
- 23. 使用FMDB和Obj-C的換行符
- 24. 關於換行和調用C函數
- 25. C#使用linq將列轉換爲行?
- 26. 使用C#刪除換行符
- 27. 使用流C++讀取換行符
- 28. 用換行位移位字符? C++
- 29. C#在運行時切換枚舉
- 30. 在C++中進行類型轉換
這是一個糟糕的解決方案,這導致了糟糕的編碼習慣,很難爲其他編碼人員維護。循環被引入到編程語言中是有原因的 – stdcall 2012-01-08 16:41:07
強詞,@Mellowcandle。我沒有從你的評論中學到任何東西。 – 2012-01-08 16:50:32
在這種情況下,循環是一個可怕的解決方案。使用memcpy會更好。編譯器可以正確地優化它,並且它更易於閱讀。 (是的,編譯器也可以優化一個簡單的循環 - 大多數情況下,但編譯器不能確信這樣做太容易了。) – ams 2012-01-08 21:09:41