C/C++編程筆記:C語言結(jié)構(gòu)體想要直接賦值,應(yīng)該如何實現(xiàn)?
首先我們來看一個實例:

我在Ubuntu 13.04下使用gcc 4.7.3 編譯運行得到的結(jié)果,如下所示:

可以從結(jié)果上看出,結(jié)構(gòu)體直接賦值在C語言下是可行的,我們看看struct_assign()函數(shù)的匯編實現(xiàn),從而從底層看看C語言是如何實現(xiàn)兩個結(jié)構(gòu)體之間的賦值操作的:

這段匯編比較簡單,由于結(jié)構(gòu)體的對齊的特性,sizeof(srtruct Foo)=16,通過四次movl操作將foo1的結(jié)構(gòu)體內(nèi)容拷貝到結(jié)構(gòu)體foo2中。從匯編上看出,結(jié)構(gòu)體賦值,采用的類似于memcpy這種形式,而不是逐個字段的拷貝。
復(fù)雜結(jié)構(gòu)體的賦值
如果結(jié)構(gòu)體中含有其它復(fù)雜數(shù)據(jù)類型呢,例如數(shù)組、指針、結(jié)構(gòu)體等,從上面的匯編實現(xiàn)可以看出,只要兩個結(jié)構(gòu)體類型相同,就可以實現(xiàn)賦值,如下例:

運行結(jié)果如下:

可以看出結(jié)果和我們想象的是一樣的。再次驗證結(jié)構(gòu)體的賦值,是直接結(jié)構(gòu)體的內(nèi)存的拷貝!但正是這個問題,如上面的實例,foo1 和 foo2 中p_c指針都是指向我們申請的一塊大小為4個字節(jié)的內(nèi)存區(qū)域,這里注意的是,結(jié)構(gòu)體的拷貝只是淺拷貝,即指針p_c的賦值并不會導(dǎo)致再申請一塊內(nèi)存區(qū)域,讓foo2的p_c指向它。
那么,如果釋放掉foo1中的p_c指向的內(nèi)存,此時foo2中p_c變成野指針,這是對foo2的p_c操作就會出現(xiàn)一些不可預(yù)見的問題!在C++中引入了一種可以允許用戶重載結(jié)構(gòu)體賦值操作運算,那么我們就可以根據(jù)語義重載賦值操作。

數(shù)組是二等公民
二等公民在維基百科上的解釋是:
二等公民不是一個正式的術(shù)語,用來描述一個社會體系內(nèi)對一部分人的歧視或?qū)ν鈦砣丝诘恼蜗拗疲词顾麄冏鳛橐粋€公民或合法居民的地位。二等公民雖然不一定是奴隸或罪犯,但他們只享有有限的合法權(quán)利、公民權(quán)利和經(jīng)濟機會,并經(jīng)常受到虐待或忽視。法律無視二等公民,不向他們提供保護,甚至在制訂法律時可能會根本不考慮他們的利益。劃分出二等公民的行為,普遍被視為一種侵犯人權(quán)的行為。典型的二等公民所面臨的障礙包括但不僅限于(缺乏或喪失表決權(quán)):權(quán)利被剝奪,限制民事或軍事服務(wù)(不包括任何情況下的征兵),以及限制,語言,宗教,教育,行動和結(jié)社的自由,武器的所有權(quán),婚姻,性別認同和表達,住房和財產(chǎn)所有權(quán)。
從詞條上解釋可以看出二等公民與一等公民在權(quán)利上是有差別的,這個詞很有意思作為計算機專業(yè)術(shù)語,其含義也有異曲同工之妙!同樣我們看看維基百科對計算機的術(shù)語”first-class citizen"(一等公民)的定義,一般要滿足以下幾點,
①can be stored in variables and data structures
②can be passed as a parameter to a subroutine
③can be returned as the result of a subroutine
④can be constructed at run-time
⑤has intrinsic identity (independent of any given name)

對比著上面的定義來看C語言數(shù)組,數(shù)組作為一個函數(shù)的參數(shù)傳遞時,退化成一個指針; 同時,數(shù)組無法作為函數(shù)的返回值; 也許讓數(shù)組更不服氣的是,數(shù)組之間不能直接賦值操作,如下面的操作就是非法的:
inta[10];
intb[10];
a=b;
但是如果數(shù)組包裝在結(jié)構(gòu)體中,那么就能進行賦值了!相比之下,結(jié)構(gòu)體可以作為函數(shù)參數(shù)和返回值,這就是一等公民的待遇!
希望對你有幫助!
原文鏈接:https://www.cnblogs.com/vanishfan/p/6891362.html

學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~