色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

strongerHuang ? 來源:嵌入式時代 ? 作者:嵌入式時代 ? 2021-03-29 11:18 ? 次閱讀

C語言函數可以返回指針、結構體,為什么不能返回數組? 下面一步一步來分析:

1

函數不能返回數組

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

char f(void)[8] { char ret; // 。..fill.。. return ret;}

int main(int argc, char ** argv){ char obj_a[10]; obj_a = f();}

2

函數可以返回結構體

上面代碼其實就是不能在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,顯然,函數可以返回結構體,即使結構體只有一個數組成員,這是為什么呢?

3

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語言語法的讀者應該能夠看出不妥之處。

4

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

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

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

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

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

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

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

5

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

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

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

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

6

小結

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

原文標題:C語言函數為什么不能返回數組?

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137408
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62867

原文標題:C語言函數為什么不能返回數組?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言如何處理函數返回

    當你在函數的最后寫上 return 0 的時候,它是如何返回給調用函數的? 比如 test 函數,為了待會更好的看懂匯編代碼,我寫成了 return 1234。 處理
    的頭像 發表于 01-16 09:21 ?61次閱讀

    如何把兩個數據返回給調用函數

    已經知道函數返回兩個數據,提前申請兩個元素的內存,并且把數組作為參數傳遞過去,把返回值放在數組中就行。 第三種,定義一個全局的結構體變量,
    的頭像 發表于 01-08 10:15 ?87次閱讀

    EE-128:C語言中的DSP:從C調用匯編類成員函數

    電子發燒友網站提供《EE-128:C語言中的DSP:從C調用匯編類成員函數.pdf》資料免費下載
    發表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的DSP:從<b class='flag-5'>C</b>調用匯編類成員<b class='flag-5'>函數</b>

    C語言筆試題

    來看一個C語言筆試題,應該很少有人能給出正確答案。 #include int f(){ printf("this is f ..."); return 1;}int g(){ printf
    的頭像 發表于 12-30 09:48 ?102次閱讀

    同樣是函數,在CC++中有什么區別

    值,即使沒有數據返回,也得寫 void。 第二個函數名。 C語言函數名絕對不能重名,除了用上
    的頭像 發表于 11-29 10:25 ?403次閱讀

    C語言中申請的堆內存能不能自動釋放

    C語言中申請的堆內存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。 學過 C++ 的同學,應該首先能想到智能指針。 但是這是C
    的頭像 發表于 11-27 09:33 ?160次閱讀

    數組名之間可以直接賦值嗎

    數組之間的賦值能不能直接使用等于號?比如這樣的代碼。 int main(){ int a[5] = {1, 2, 3, 4, 5}; int b[5] = {0}; b = a
    的頭像 發表于 11-26 11:23 ?200次閱讀

    C語言數組應用計算機導論A第6講:數組

    C語言數組應用計算機導論A第6講:數組
    發表于 11-20 15:33 ?0次下載

    解讀版|Air780E軟件中C語言內存數組的神秘面紗!

    今天我們來揭開Air780E 軟件中 C 語言內存數組的神秘面紗,希望有所收獲。
    的頭像 發表于 11-17 10:00 ?296次閱讀
    解讀版|Air780E軟件中<b class='flag-5'>C</b><b class='flag-5'>語言</b>內存<b class='flag-5'>數組</b>的神秘面紗!

    使用C語言實現函數模板

      用C語言不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
    的頭像 發表于 11-09 11:38 ?443次閱讀

    C語言指針詳細解析

    。 二維數組 二維數組其實可以看成是一個矩陣,zai C語言中,定義一個數組num[3][4],可以看成是一個3行4列的矩陣,在內存中每一個
    發表于 09-14 10:03

    面試常考+1:函數指針與指針函數數組指針與指針數組

    在嵌入式開發領域,函數指針、指針函數數組指針和指針數組是一些非常重要但又容易混淆的概念。理解它們的特性和應用場景,對于提升嵌入式程序的效率和質量至關重要。一、指針
    的頭像 發表于 08-10 08:11 ?976次閱讀
    面試常考+1:<b class='flag-5'>函數</b>指針與指針<b class='flag-5'>函數</b>、<b class='flag-5'>數組</b>指針與指針<b class='flag-5'>數組</b>

    C語言中,同一個函數不能被定義兩次?

    稍微有點C語言基礎的同學,一定知道不能這樣做。
    的頭像 發表于 05-11 18:27 ?1865次閱讀

    嵌入式系統中C語言結構體的基礎實現與應用

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構是C語言編程中允許您存儲不同數據類型的數據。
    發表于 03-12 14:29 ?543次閱讀
    嵌入式系統中<b class='flag-5'>C</b><b class='flag-5'>語言</b>結構體的基礎實現與應用

    C語言字符串編譯函數介紹

    C語言中,字符串實際上是使用null字符O'終止的一維字符數組。因此,一個以null結尾的字符串,包含了組成字符串的字符。
    的頭像 發表于 03-07 16:18 ?534次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>字符串編譯<b class='flag-5'>函數</b>介紹
    主站蜘蛛池模板: XXX国产麻豆HD| 俄罗斯18xv在线观看| 国产成人综合在线观看网站| 女人张开腿让男人添| 中文字幕在线免费视频| 久久这里只有精品视频9 | av免费网站不卡观看| 免费观看亚洲视频| 97视频在线观看免费播放| 免费 高清 中文在线观看| 55夜色66夜亚洲精品播放| 男人天堂999| sao虎影院桃红视频在线观看| 欧美日韩精品一区二区三区四区| s8sp视频高清在线播放| 手机伊在人线香蕉2| 国产精品人妻午夜福利| 亚洲精品久久久一区| 久99re视频9在线观看| 中文字幕本庄优花喂奶| 欧美成人无码视频午夜福利| 吃寂寞寡妇的奶| 午夜免费小视频| 精品视频中文字幕| 51久久夜色精品国产| 桥本有菜黑丝| 国产成人免费高清视频| 亚洲成人欧美| 久久综合狠狠综合久久综合88| 99国产小视频| 四虎影5151毛片在线看| 精品综合久久久久久8888| 7777色鬼xxxx欧美色夫| 日本高清天码一区在线播放| 国产精品免费大片一区二区| 一本久道久久综合狠狠躁AV| 男女牲交全过程免费播放| 贵妇局长的蕾丝乳罩| 亚洲欧美中文字幕5发布| 男人国产AV天堂WWW麻豆| 国产精品亚洲AV毛片一区二区三区 |