最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2020-05-28 14:48 作者:C語言編程__Plus  | 我要投稿

首先我們來看一個實例:

我在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í)的小伙伴一定要去看一看哦!會對你有幫助的~

C/C++編程筆記:C語言結(jié)構(gòu)體想要直接賦值,應(yīng)該如何實現(xiàn)?的評論 (共 條)

分享到微博請遵守國家法律
定陶县| 信阳市| 山阴县| 普兰县| 汉沽区| 阿瓦提县| 娄烦县| 阿鲁科尔沁旗| 江达县| 札达县| 榆树市| 洛浦县| 兴仁县| 永州市| 葫芦岛市| 丰宁| 云安县| 亳州市| 长子县| 武定县| 余江县| 金湖县| 黄大仙区| 鹿邑县| 北辰区| 庆安县| 鲁甸县| 东至县| 莱州市| 盈江县| 湖州市| 芦山县| 任丘市| 武城县| 盐池县| 青浦区| 龙里县| 曲阳县| 柘荣县| 广元市| 宽甸|