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

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

編程知識:C語言函數(shù)為什么不能返回數(shù)組?小心面試被問到!

2021-03-24 16:58 作者:C語言編程__Plus  | 我要投稿

C語言函數(shù)可以返回指針、結(jié)構(gòu)體,為什么不能返回數(shù)組?


下面一步一步來分析:

函數(shù)不能返回數(shù)組

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


上面代碼其實就是不能在C語言函數(shù)中返回數(shù)組。

函數(shù)可以返回結(jié)構(gòu)體

但是如果將數(shù)組定義在結(jié)構(gòu)體里面,就可以將其返回了,例如下面這段C語言代碼,請看:


結(jié)構(gòu)體 s 只有一個數(shù)組成員 arr,顯然,函數(shù)可以返回結(jié)構(gòu)體,即使結(jié)構(gòu)體只有一個數(shù)組成員,這是為什么呢?

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

基本上,C語言中的數(shù)據(jù)結(jié)構(gòu)可以分為兩類,?第一類數(shù)據(jù)結(jié)構(gòu)可以被賦值,而第二類數(shù)據(jù)結(jié)構(gòu)不可以被賦值,數(shù)組屬于第二類數(shù)據(jù)結(jié)構(gòu)。

除了數(shù)組,還有其他第二類數(shù)據(jù)結(jié)構(gòu)嗎?我想基本上沒有了,除非把函數(shù)算上。

與函數(shù)不能返回數(shù)組密切相關(guān)的事實是,C語言沒有嚴格意義上的“數(shù)組類型”??赡軓腃語言代碼角度來看,似乎有數(shù)組類型的變量。

但是如果嘗試將該變量像其他變量一樣使用,得到的實際上是指向數(shù)組第一個元素的指針。例如下面這段C語言代碼:

char a[10], b[10];

a= b;

這并不能把數(shù)組 b 的內(nèi)容拷貝給數(shù)組 a,實際上,上面兩行C語言代碼相當(dāng)于下面這一行:

a= &b[0];

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

a= f();

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

char ret[10];

/* ... fill ... */

return ret;

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

return &ret[0];

同樣的,我們?nèi)羰菄L試將數(shù)組賦值給 a,最終實際得到仍然是將指針賦值給 a,熟悉C語言語法的讀者應(yīng)該能夠看出不妥之處。


為什么把數(shù)組塞入結(jié)構(gòu)體,情況就不同了呢?

上面提到,雖然C語言的數(shù)組不可以被賦值,但是將其塞入結(jié)構(gòu)體就可以賦值了。?這是什么原因呢?

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

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

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

基于這樣的原理,早期的C語言其實連結(jié)構(gòu)體賦值都是不支持的。

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


C語言中的結(jié)構(gòu)體也可包含多個字節(jié)信息

正如上面所說,早期的C語言的確不支持結(jié)構(gòu)體賦值,但是在后來的發(fā)展中卻增加了結(jié)構(gòu)體賦值能力。?對此只能說是結(jié)構(gòu)體幸運,“將C語言基本操作控制在少量機器周期內(nèi)”只是一個準(zhǔn)則,而不是限制。

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

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

小結(jié)

C語言不支持數(shù)組賦值,更多的原因是C語言本身的特點(貼合硬件)以及一些歷史原因。不過,如果真的希望對數(shù)組賦值,也是有一些技巧的,例如將數(shù)組塞入結(jié)構(gòu)體。

PS:另外對于學(xué)習(xí)編程或者正在工作的朋友,如果你想更好的提升你的編程能力乃至轉(zhuǎn)行,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

微信公眾號:C語言編程學(xué)習(xí)基地

分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!



編程知識:C語言函數(shù)為什么不能返回數(shù)組?小心面試被問到!的評論 (共 條)

分享到微博請遵守國家法律
徐闻县| 上林县| 黄大仙区| 霸州市| 高平市| 青海省| 含山县| 长葛市| 溆浦县| 青神县| 南皮县| 板桥市| 同仁县| 工布江达县| 周口市| 白玉县| 金昌市| 延庆县| 枣强县| 华池县| 格尔木市| 青川县| 岐山县| 乐陵市| 遂平县| 淮阳县| 迁西县| 乌兰县| 垦利县| 湄潭县| 那坡县| 金溪县| 鲁山县| 宿州市| 剑河县| 丰原市| 马山县| 望谟县| 兴海县| 都安| 平阴县|