為什麼c 中陣列不能直接拷貝給另一陣列?

時間 2021-05-31 10:15:44

1樓:d41d8c

結構體的拷貝建構函式中,陣列可以拷貝。

lambda的拷貝捕獲可以捕獲陣列:int a[2]; [a] {}。

structured binding也可以產生陣列的拷貝:int a[2]; auto [x,y] = a;中,x和y繫結到a的副本中的元素。

甚至char a = "asdf";這種初始化也可以看作陣列拷貝的特例。

所以拷貝陣列似乎沒有技術上的難度。

陣列不能直接拷貝,大概只能歸結於歷史原因。

很久很久以前,在C語言還不叫C語言的時候,陣列名就是指標(不是const指標),那時對陣列名的賦值就是指標賦值。後來為了支援結構體中的陣列(思考一下,如果陣列名就是指標,那麼結構體成員陣列儲存在哪?),才做了區分,並禁止賦值。

然而這裡留了個尾巴,作為函式形參的陣列還是會轉換成指標。C++把這些規定都繼承過來了。

從此以後就一直沒允許直接拷貝。

這個尾巴還有點麻煩。考慮

int a[2];

int f(int b[2]);

這時f(a)會把a轉換成指標傳遞(而不是拷貝陣列內容)。

類似地,auto b = a;也會把b當成指標(原因是auto的型別推導採用函式引數的規則)。

於是用int b[2] = a;形式進行陣列內容拷貝還是受到很大阻力,到現在都沒法允許。

2樓:yy xx

這跟異常有什麼關係?陣列是c語言的產物,c語言有異常嗎?

在c語言裡面陣列就是語法糖來的,乙個語法糖誰考慮那麼多。而c++他爹一開始為了省事,直接沿用c語言設定,就是這麼回事。

c 中 為什麼陣列不能被vector完全替代

hiJack 1.陣列的記憶體是是靜態,vector的記憶體是動態,可能發生拷貝變動。2.陣列效率高,vector效率相對低,因為vector實質上是在陣列的基礎上實現的。3.陣列可以與C相容,vector不可以 除此之外沒有區別,vector更方便 陳禮 原因很多,舉個例子,部分驅動程式是用c 寫...

為什麼很多程式語言中不能直接列印陣列?

丁長老 函式式語言不清楚,說點我知道的。列印陣列需要有下面三個條件 1.陣列的長度 2.陣列中值的型別 3.陣列中值不存在迴圈引用 第一條陣列的長度,c語言就被乾掉了,c語言沒法獲取陣列的長度,其他語言,有容器功能的,或者單獨內建array類的,拿到長度不是問題。第二條,陣列中值的型別。求型別就要求...

玩lol中單為什麼總是不能c?

Yyyyyyyyyjs 卡牌加里奧不是用來給你c的,是用來幫隊友c的發條沙皇如果不是實力碾壓,是需要別人幫你創造條件,你才能c的,要隊友幫你拖過發育期 然而現實是全圖流沒地飛,三線炸,或者幫了不拿資源白幫,發育流誰都來你中路吃線,你敢去別路補發育隊友就敢4打5 中單想c雙排工具人打野拿順手的一路殺穿...