[英]Copying structure elements vs copying array elements in C
正如在這個問題的答案中所描述的那樣, 將一個結構復制到另一個結構 ,我們可以通過簡單的賦值將結構元素的內容復制到另一個。 E1 = E2;
但復制數組元素時,這個簡單的賦值不起作用。 有人可以提供解釋嗎?
謝謝。
數組是C中的二等公民:您不能將數組分配給數組,也不能從函數返回數組。
Chris Torek在comp.lang.c中提供了這個解釋:
“請注意,V6 C也不支持結構值參數和結構值返回值。然后,可能會想象Dennis認為任何不適合寄存器的返回值都是太多工作要放入編譯器中那一點。“
數組不是可修改的左值 ( “具有位置(在內存中)”的東西 )。 這意味着雖然它是左值,但它不能是賦值operator =
的左操作數。
在結構的情況下,除了賦值*之外 ,C不對整個結構提供操作。 不能使用==
, !=
運算符來測試兩個結構是否相等。
您可以創建虛擬結構來封裝稍后將復制的數組:
struct
{
int arr[5];
} arr1, arr2;
您可以分配
arr1 = arr2;
* =
運算符只能用於兼容的結構類型。
數組的名稱是數組*的第一個元素的地址的別名:
#include <stdio.h>
int main()
{
int foo[5] = {2, 3, 4, 5, 6};
int *bar = foo;
// now bar == foo, i.e. bar == &foo[0], so changing bar[2] changes foo[2]
// bar[2] works because of pointer arithmetic
printf(" foo is: %p\n",foo); // prints the address of the first element of foo
printf("&foo[0] is: %p\n", &foo[0]); // also prints the address of the first element of foo
printf(" bar is: %p\n", bar);
printf("&bar[0] is: %p\n", &bar[0]);
printf(" foo[2] is: %d\n", foo[3]);
printf(" bar[2] is: %d\n", bar[3]);
return 0;
}
*有一些例外。 即sizeof foo != &foo[0]
。 請參見如何將數組的地址等於其在C中的值?
因此,當您編寫arr1 = arr2
,編譯器認為您只是引用數組的地址而不是整個數組。 當您編寫結構的名稱時,編譯器知道您將整個結構稱為結構,而不僅僅是第一個成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.