首页
/
每日頭條
/
科技
/
c語言結構體定義的指針怎麼賦值
c語言結構體定義的指針怎麼賦值
更新时间:2024-12-17 12:36:34

首先我們來看一個實例:

c語言結構體定義的指針怎麼賦值(CC編程筆記)1

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

c語言結構體定義的指針怎麼賦值(CC編程筆記)2

可以從結果上看出,結構體直接賦值在C語言下是可行的,我們看看struct_assign()函數的彙編實現,從而從底層看看C語言是如何實現兩個結構體之間的賦值操作的:

c語言結構體定義的指針怎麼賦值(CC編程筆記)3

這段彙編比較簡單,由于結構體的對齊的特性,sizeof(srtruct Foo)=16,通過四次movl操作将foo1的結構體内容拷貝到結構體foo2中。從彙編上看出,結構體賦值,采用的類似于memcpy這種形式,而不是逐個字段的拷貝。

複雜結構體的賦值

如果結構體中含有其它複雜數據類型呢,例如數組、指針、結構體等,從上面的彙編實現可以看出,隻要兩個結構體類型相同,就可以實現賦值,如下例:

c語言結構體定義的指針怎麼賦值(CC編程筆記)4

運行結果如下:

c語言結構體定義的指針怎麼賦值(CC編程筆記)5

可以看出結果和我們想象的是一樣的。再次驗證結構體的賦值,是直接結構體的内存的拷貝!但正是這個問題,如上面的實例,foo1 和 foo2 中p_c指針都是指向我們申請的一塊大小為4個字節的内存區域,這裡注意的是,結構體的拷貝隻是淺拷貝,即指針p_c的賦值并不會導緻再申請一塊内存區域,讓foo2的p_c指向它。

那麼,如果釋放掉foo1中的p_c指向的内存,此時foo2中p_c變成野指針,這是對foo2的p_c操作就會出現一些不可預見的問題!在C 中引入了一種可以允許用戶重載結構體賦值操作運算,那麼我們就可以根據語義重載賦值操作。

c語言結構體定義的指針怎麼賦值(CC編程筆記)6

數組是二等公民

二等公民在維基百科上的解釋是:

二等公民不是一個正式的術語,用來描述一個社會體系内對一部分人的歧視或對外來人口的政治限制,即使他們作為一個公民或合法居民的地位。二等公民雖然不一定是奴隸或罪犯,但他們隻享有有限的合法權利、公民權利和經濟機會,并經常受到虐待或忽視。法律無視二等公民,不向他們提供保護,甚至在制定法律時可能會根本不考慮他們的利益。劃分出二等公民的行為,普遍被視為一種侵犯人權的行為。典型的二等公民所面臨的障礙包括但不僅限于(缺乏或喪失表決權):權利被剝奪,限制民事或軍事服務(不包括任何情況下的征兵),以及限制,語言,宗教,教育,行動和結社的自由,武器的所有權,婚姻,性别認同和表達,住房和财産所有權。

從詞條上解釋可以看出二等公民與一等公民在權利上是有差别的,這個詞很有意思作為計算機專業術語,其含義也有異曲同工之妙!同樣我們看看維基百科對計算機的術語”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語言結構體定義的指針怎麼賦值(CC編程筆記)7

對比着上面的定義來看C語言數組,數組作為一個函數的參數傳遞時,退化成一個指針; 同時,數組無法作為函數的返回值; 也許讓數組更不服氣的是,數組之間不能直接複制操作,如下面的操作就是非法的:

inta[10];

intb[10];

a=b;

但是如果數組包裝在結構體中,那麼就能進行賦值了!相比之下,結構體可以作為函數參數和返回值,這就是一等公民的待遇!

希望對你有幫助!

學習C/C 編程知識,想要成為一個更加優秀的程序員,或者你學習C/C 的時候有難度,可以關注 私信小編【C/C 編程】筆者的C語言C 零基礎編程學習圈,裡面不僅有學習視頻和文件源碼,還有更多志同道合的朋友,歡迎轉行也學習編程的夥伴,和大家一起交流成長會比自己琢磨更快哦!

c語言結構體定義的指針怎麼賦值(CC編程筆記)8

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
十大辦公軟件排行
十大辦公軟件排行
1、騰訊QQ是深圳市騰訊計算機系統有限公司開發的一款基于Internet的即時通信(IM)軟件。騰訊...
2024-12-17
怎麼開網店賣東西
怎麼開網店賣東西
1、開通淘寶網店、這是最基礎的,畢竟你有了店鋪才可以進行賣東西銷售,注冊開通店鋪隻要你年滿16周歲,有身份證,然後在淘寶官網進行注冊認證就可以了,我之前的文章有詳細說過可以翻開看看。2、尋找産品、也就是說你開這個店鋪打算賣什麼産品,這個貨源一種你可以自己去進貨,自己拍照,自己找模特找物流,但是這樣的投資比較大風險比較大。第二種就是在網上找貨源一件代發,建議新手都選擇這個模式,投資小風險小,适合新手
2024-12-17
交通違章扣分周期怎麼計算
交通違章扣分周期怎麼計算
1、一個周期為12個月,從開始領取駕駛證的那天算起一年度的時間。2、一個周期總分數為12分,從開始領取駕駛證的那天算起,一個周期結束後,如果記分的所有分值,加起來沒有達到12分,那麼這個周期内的分數,通過繳納罰款是可以消除的,不會再轉到下一個年度。3、上當地的公安交警網,進入信息查詢”網頁,選擇駕駛員信息查詢”有七項,其中有交通違章查詢、滿分情況查詢”,輸入你要查的身份證号碼和駕駛證檔案編号廣東省
2024-12-17
虎牙直播怎麼換頭像
虎牙直播怎麼換頭像
1、首先打開手機上的虎牙直播”。2、再登錄到虎牙直播的頁面,點擊頁面右下角的我的”。3、我的”頁面,點擊頭像,就進入了個人信息。4、【個人信息】的頁面,點擊頭像這一項。5、從手機相冊中選擇自己喜歡的圖片作為頭像就可以了。
2024-12-17
交強險保單丢了怎麼辦
交強險保單丢了怎麼辦
1、車主應立即去補辦,根據保險公司的相關規定,一般補辦需要提供本人的身份證以及行駛證原件。車主也可以委托他人進行補辦,不過就需要本人出具委托第三人代為補辦交強險的委托書以及相關委托證明材料,當然之前提到的證件也要帶齊。2、保險公司受理交強險保單補辦申請後,一般幾個工作日内,對所提供的材料進行審核,審核通過後即可重新打印交強險保單。3、交強險保單是車輛交了保險的憑證,當我們購買了交強險後,保險公司會
2024-12-17
Copyright 2023-2024 - www.tftnews.com All Rights Reserved