日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么C语言函数不能返回数组,却可以返回结构体?

發布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么C语言函数不能返回数组,却可以返回结构体? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言函數為什么不能返回數組?


在C語言程序開發中,我們不可以編寫下面這樣的代碼:

char f(void)[8] { char ret; // ...fill... return ret; } int main(int argc, char ** argv) { char obj_a[10];obj_a = f(); }


不可以編寫這樣的代碼


這其實就是不能在C語言函數中返回數組。但是如果將數組定義在結構體里面,就可以將其返回了,例如下面這段C語言代碼,請看:

struct s { char arr[10]; }; struct s f(void) { struct s ret; // ...fill... return ret; } int main(int argc, char ** argv) { struct s obj_a;obj_a = f(); }


函數可以返回結構體


結構體 s 只有一個數組成員 arr,顯然,函數可以返回結構體,即使結構體只有一個數組成員,這是為什么呢?


C語言沒有嚴格意義上的“數組類型”


基本上,C語言中的數據結構可以分為兩類,第一類數據結構可以被賦值,而第二類數據結構不可以被賦值,數組屬于第二類數據結構。


除了數組,還有其他第二類數據結構嗎?我想基本上沒有了,除非把函數算上。

與函數不能返回數組密切相關的事實是,C語言沒有嚴格意義上的“數組類型”。可能從C語言代碼角度來看,似乎有數組類型的變量,但是如果嘗試將該變量像其他變量一樣使用,得到的實際上是指向數組第一個元素的指針。例如下面這段C語言代碼:

char a[10], b[10]; a = b;

這并不能把數組 b 的內容拷貝給數組 a,實際上,上面兩行C語言代碼相當于下面這一行:

a?=?&b[0];顯然,左邊是數組 a,而右邊其實是一個指針。即使數組在某種程度上可以看作能夠被賦值,但我們有很大幾率得到類型不匹配,例如下面這段C語言代碼: a = f();

這里假設 f() 是一個返回數組的函數,它的核心C語言代碼如下:

char ret[10]; /* ... fill ... */ return ret;

不過按照前面所說的,其實上面的返回語句相當于下面這一句:

return &ret[0];

同樣的,我們若是嘗試將數組賦值給 a,最終實際得到仍然是將指針賦值給 a,熟悉C語言語法的讀者應該能夠看出不妥之處。


為什么把數組塞入結構體,情況就不同了呢?


文章開頭提到,雖然C語言的數組不可以被賦值,但是將其塞入結構體就可以賦值了。這是什么原因呢?


其實這涉及到C語言的設計初衷,以及相關的一些發展歷史了。C語言在語法和語義上與機器硬件很接近,它的基本操作可以被編譯為一個或者幾個機器指令,占用若干個處理器周期。


C語言中的數組是特殊的,它與指針一直都是非常曖昧的。這種曖昧的關系從C語言的前身B語言就開始了,并一直延續至今,而今天的結構體語法最初并不是包含在C語言中的。


因為C語言數組與指針的曖昧關系,編譯器也很難區分它們,所以我們不可能為C語言數組賦值。而且由于“賦值”操作也屬于C語言的基本操作,為了貼合硬件,要求其必須在幾個處理器周期完成,所以單個的“賦值”運算符 = 基本上不可能擴展到需要幾千乃至幾萬個機器周期,以對成千上萬個數組元素賦值。


基于這樣的原理,早期的C語言其實連結構體賦值都是不支持的。


到這里,相信不少讀者又有疑問了,既然C語言的基本操作需要控制在少量的機器周期內,那為什么結構體賦值卻是支持的呢?畢竟C語言中的結構體也是可以包含多個字節信息的。


C語言中的結構體也是可以包含多個字節信息的


正如前文所說,早期的C語言的確不支持結構體賦值,但是在后來的發展中卻增加了結構體賦值能力。對此只能說是結構體幸運,“將C語言基本操作控制在少量機器周期內”只是一個準則,而不是限制。


要知道,C語言結構體通常很小,只有幾十到幾百字節,增加結構體賦值能力無疑能夠大大方便程序員編寫代碼。大多數情況下,結構體賦值操作并不會嚴重“超時”,這其實是一種平衡。


我之前的文章曾經討論過,程序設計語言一般都要處理一個天平,天平的兩端分別是機器和程序員,如果追求極致的機器效率,將編程語言設計的十分精簡,那么程序員就會非常痛苦。因此,即使是C語言,在追求高效率的同時,也要兼顧程序員的感受,所以稍稍違背一些設計準則,增加一些便利操作也是無可厚非的。


小結

C語言不支持數組賦值,更多的原因是C語言本身的特點(貼合硬件)以及一些歷史原因。不過,如果真的希望對數組賦值,也是有一些技巧的,例如將數組塞入結構體。這一點我之前的文章已經討論過,不再贅述了。

-END-

﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

免責聲明:本文轉自網絡,版權歸原作者所有,如涉及作品版權問題,請及時與我們聯系,謝謝!

往期好文合集

干貨 | 雙目攝像頭實現手勢識別,完美還原人體運動手勢。戳這里>>

這篇文章后,不要再問我怎么做一臺智能車了。戳這里>>

群體智能,多個機器人協同搬運!戳這里>>

這2個單片機編程的思想,請你掌握。戳這里>>

??最 后??

?

若覺得文章不錯,轉發分享,也是我們繼續更新的動力。

5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等

在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~

長按識別圖中二維碼關注

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的为什么C语言函数不能返回数组,却可以返回结构体?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线看欧美 | 欧美成人精品在线观看 | 日本成人在线播放 | 伊人66 | 日韩av高清在线播放 | 日本孰妇毛茸茸xxxx | 成人小网站 | 国产日韩成人 | 欧美精品色哟哟 | 三年中文免费观看大全动漫 | 亚洲欧美综合在线观看 | 艳妇臀荡乳欲伦交换电影 | bbbbbxxxxx性欧美 | www插插插 | 99re在线视频观看 | 农村妇女一区二区 | 少妇精品久久久久www | 亚洲免费黄色 | 少妇av一区 | www.色在线 | 狠狠干美女 | 久久精选 | 免费观看黄色一级片 | 亚洲精品乱码久久久久久蜜桃图片 | 极品人妻一区二区三区 | av中文字幕一区 | 日韩欧美亚洲 | 99爱在线视频 | 日本嫩草影院 | 国产精品久久久久久久一区探花 | 亚洲第八页 | 亚洲伦理精品 | 久99| 国产主播在线看 | 99在线视频免费观看 | 三级久久 | 青青操视频在线 | 狼人伊人干 | 性欢交69精品久久久 | av中文字幕观看 | 中文字幕一区二区三区日韩精品 | 91大神在线看 | 国产精品成人无码专区 | 亚州av免费 | 国产又黄又嫩又滑又白 | 日韩深夜在线 | 少妇极品熟妇人妻无码 | 国产精品国语对白 | 厕拍极品| 国产女人在线观看 | 免费观看av的网站 | 婷婷综合网站 | 尤物精品在线观看 | 日韩欧美国产精品 | 又爽又黄又无遮挡 | 欧美日日日 | 香蕉av一区二区 | 日韩精品1 | 91爱在线观看 | 国产午夜性春猛交ⅹxxx | 日韩av电影网址 | 一区二区三区www | 在线观看的毛片 | 国产a级免费视频 | 美女污污网站 | 亚洲一区二区在线视频 | 性中国xxx极品hd | 探花国产精品一区二区 | 国产精品黄网站 | 亚洲7777| www日韩在线 | 日本在线视频免费 | www.亚洲高清 | 大学生三级中国dvd 日韩欧美一区二区区 | 大奶在线观看 | 国产精品一二三区 | 久久夜色精品 | 大学生一级一片全黄 | www视频免费在线观看 | 亚洲精品视频在线观看免费视频 | 精品视频一区二区三区 | 人人妻人人澡人人爽人人精品 | 少妇的被肉日常np | 夜夜嗨av一区二区三区四区 | 91国产精品| 日韩va在线 | 国产精品久久久久久久久久久免费看 | 国产一区精品在线观看 | 在线观看国产网站 | 噜噜狠狠狠狠综合久久 | 天天天天天天天干 | 天堂在线观看 | 婷婷精品在线 | 日韩成人久久 | 亚洲欧洲日本精品 | 国产午夜片 | 亚洲精品男人的天堂 | 成年人免费看的视频 | 秋霞无码一区二区 |