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

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

3天內(nèi)不再提示

C語言函數(shù)為什么不能返回數(shù)組?

電子工程技術(shù) ? 來源:電子工程技術(shù) ? 2019-11-26 11:25 ? 次閱讀

C語言函數(shù)為什么不能返回數(shù)組?

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

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

不可以編寫這樣的代碼

這其實就是不能在C語言函數(shù)中返回數(shù)組。但是如果將數(shù)組定義在結(jié)構(gòu)體里面,就可以將其返回了,例如下面這段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();}

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

結(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ù)組類型”。可能從C語言代碼角度來看,似乎有數(shù)組類型的變量,但是如果嘗試將該變量像其他變量一樣使用,得到的實際上是指向數(shù)組第一個元素的指針。例如下面這段C語言代碼:

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

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

a = &b[0];

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

a = f();

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

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

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

return &ret[0];

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

為什么把數(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)”只是一個準則,而不是限制。

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

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

小結(jié)

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

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

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135566
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4259

    瀏覽量

    62227
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4695

    瀏覽量

    68080

原文標題:為什么C語言函數(shù)不能返回數(shù)組,卻可以返回結(jié)構(gòu)體

文章出處:【微信號:EngicoolArabic,微信公眾號:電子工程技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    面試???1:函數(shù)指針與指針函數(shù)數(shù)組指針與指針數(shù)組

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

    數(shù)組與指針不能混用的情況

    數(shù)組與指針不能混用的情況? 數(shù)組與指針是 C/C++ 中非常常見的特性和概念。然而,在某些情況下,數(shù)組
    的頭像 發(fā)表于 12-07 13:46 ?528次閱讀

    C語言數(shù)組的用法

    C語言數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它可以存儲多個相同類型的數(shù)據(jù),例如整數(shù),字符,浮點數(shù)等。數(shù)組的每個元素都有一個索引,用來表示它在數(shù)組中的位置。
    的頭像 發(fā)表于 11-24 17:48 ?1144次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中<b class='flag-5'>數(shù)組</b>的用法

    c語言源程序main函數(shù)的位置

    C語言源程序中的main函數(shù)是程序的入口點,它被認為是C語言程序的起點。在執(zhí)行程序時,操作系統(tǒng)將首先定位到main
    的頭像 發(fā)表于 11-24 10:23 ?2108次閱讀

    c語言源程序的基本單位

    個或多個函數(shù)組成。每個函數(shù)都有一個函數(shù)名和一對大括號{},大括號中是函數(shù)的代碼塊。函數(shù)可以接受一些參數(shù),并且可以
    的頭像 發(fā)表于 11-24 10:20 ?1439次閱讀

    c語言中多維數(shù)組可以嵌套定義

    C語言中多維數(shù)組可以嵌套定義,這使得我們可以在一個數(shù)組中存儲另一個數(shù)組。通過這種方式,我們可以創(chuàng)建更加復雜和靈活的數(shù)據(jù)結(jié)構(gòu),以便更好地表示和
    的頭像 發(fā)表于 11-24 10:18 ?931次閱讀

    c語言數(shù)組怎么定義

    C語言中,數(shù)組是一種用來存儲相同類型元素的數(shù)據(jù)結(jié)構(gòu)。它可以存儲多個元素,并通過一個共同的名稱來引用這些元素。數(shù)組是一種很重要的數(shù)據(jù)結(jié)構(gòu),可以用于解決很多實際的問題。 在
    的頭像 發(fā)表于 11-24 10:11 ?2559次閱讀

    C語言如何創(chuàng)建數(shù)組

    C語言是一種非常強大和靈活的編程語言,它提供了若干數(shù)據(jù)類型來存儲和操作數(shù)據(jù)。其中之一就是數(shù)組,它可以用來存儲一系列具有相同數(shù)據(jù)類型的元素。本文將詳細介紹如何在
    的頭像 發(fā)表于 11-24 10:08 ?1524次閱讀

    c語言數(shù)組中查找指定元素

    C語言是一種通用的編程語言,廣泛應用于各種領(lǐng)域,包括嵌入式系統(tǒng)、操作系統(tǒng)、游戲開發(fā)等。在C語言中,數(shù)組
    的頭像 發(fā)表于 11-24 10:07 ?3274次閱讀

    c語言gets函數(shù)可以輸入數(shù)字嗎

    C語言中的gets函數(shù)是用來讀取字符串的,而不是用來讀取數(shù)字的。它會讀取輸入的字符直到遇到換行符或者文件結(jié)束符。因此,如果你嘗試使用gets函數(shù)來讀取數(shù)字,是無法準確獲取數(shù)字本身的。
    的頭像 發(fā)表于 11-24 10:00 ?1304次閱讀

    c語言max函數(shù)在哪個庫

    C語言的max函數(shù)并不屬于標準C庫,它通常是由程序員自己編寫的一個宏定義。max函數(shù)用于比較兩個數(shù)的大小,
    的頭像 發(fā)表于 11-22 10:18 ?2993次閱讀

    c語言max函數(shù)的使用方法

    C語言是一門廣泛使用的編程語言,提供了許多內(nèi)置的函數(shù)來執(zhí)行各種任務。其中一個非常有用的函數(shù)是max函數(shù)
    的頭像 發(fā)表于 11-22 10:15 ?1.2w次閱讀

    python函數(shù)返回多個參數(shù)

    函數(shù)是程序設(shè)計中的一個重要概念,在很多編程語言中都存在。函數(shù)可以接受輸入數(shù)據(jù),并且根據(jù)輸入數(shù)據(jù)進行一系列操作,最后可以返回一個或多個結(jié)果。Python是一種非常流行的編程
    的頭像 發(fā)表于 11-21 16:37 ?1051次閱讀

    tuple函數(shù)怎么返回多個值

    在編程領(lǐng)域中,函數(shù)是非常重要的構(gòu)建模塊,它能夠接受輸入?yún)?shù)并執(zhí)行特定的計算,最終返回結(jié)果供程序使用。常規(guī)的函數(shù)只能返回一個值,但有時我們希望函數(shù)
    的頭像 發(fā)表于 11-21 16:33 ?623次閱讀

    C語言函數(shù)返回1和返回0究竟哪個好?

    C語言函數(shù)返回1和返回0究竟哪個好? 在C語言中,很
    的頭像 發(fā)表于 10-31 14:43 ?878次閱讀