国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

電子工程技術 ? 來源:電子工程技術 ? 2019-11-26 11:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

    關注

    183

    文章

    7644

    瀏覽量

    145574
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67501
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960

原文標題:為什么C語言函數不能返回數組,卻可以返回結構體

文章出處:【微信號:EngicoolArabic,微信公眾號:電子工程技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    傳遞一個無符號的 long 型指針給函數

    C語言允許傳遞指針給函數,只需要簡單地聲明函數參數為指針類型即可。 下面的實例中,我們傳遞一個無符號的 long 型指針給函數,并在
    發表于 01-27 11:51

    指針與函數詳解

    。 2、函數指針函數指針,本質上他是一個指針,并不是一個函數。在C語言中有些概念是一脈相承的,之前的推文《指針與
    發表于 01-23 06:02

    keil中c語言的動態分配內存

    C程序中,通常將內存劃分為以下六個區域: (1)內核區域。這塊區域是操作系統的,用戶不能使用。 (2)棧區。主要用于存放運行函數而分配的局部變量、函數參數、
    發表于 01-21 06:04

    C語言主要特點

    。 3.數據類型豐富。C語言提供的數據類型包括整形、浮點型、字符型、數組類型、指針類型、結構體類型和共用體類型等,C99又擴充了復數浮點型、超長整型(long long)和布爾類型(b
    發表于 01-05 07:41

    C語言函數指針的六個高級的應用場景

    process_array 函數,它接受三個參數:一個整型數組數組大小和一個函數指針。函數指針指向一個
    發表于 01-04 12:25

    C語言嵌入式系統編程注意事項-內存操作

    字節為單位編址,而C語言指針以指向的數據類型長度作自增和自減。理解這一點對于以指針直接操作內存是相當重要的。 函數指針 首先要理解以下三個問題: (1)C
    發表于 01-04 07:31

    C語言回調函數原來這么簡單

    ” 這個概念,它是回調函數能夠實現的重要基礎。 1、函數指針學習過C語言的伙伴都知道,C語言中的
    發表于 12-30 06:45

    C語言中實現函數宏的三種方式

    (0) 不同的是,({}) 不能提前退出函數宏與支持返回值。({}) 畢竟不是 while 循環,不能直接使用 break退出函數宏是比較容
    發表于 12-29 07:34

    如何用好 C 語言函數返回值?

    可能會比較復雜,不同的輸入,常常產生不同的輸出結果。 C語言函數返回C語言
    發表于 12-25 07:17

    C語言C++的區別及聯系

    創建源文件時什么都不給,默認是.cpp。 3、返回C語言中,如果一個函數沒有指定返回值類型,默認
    發表于 12-24 07:23

    C語言C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++在
    發表于 12-11 06:23

    C語言的編程技巧

    一個成員是一個未知大小的數組,適用于動態分配內存并關聯一個可變長度的數組。? ?3、匿名結構體和聯合體?:C語言允許在結構體或聯合體中定義不帶標簽的內部結構體或聯合體,簡化代碼結構。
    發表于 11-27 06:46

    C語言中的內聯函數與宏

    C編程中,內聯函數和宏都用于避免函數調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發表于 07-25 15:10 ?1909次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的內聯<b class='flag-5'>函數</b>與宏

    深入理解C語言函數—編程中的“積木塊”藝術

    在編程的世界里,函數就像建筑中的“積木塊”——它們是構建復雜程序的基石。通過靈活組合這些模塊,開發者能打造出功能強大且結構清晰的代碼。函數之所以成為C語言的核心,正是因為它解決了編程中
    的頭像 發表于 06-30 17:26 ?1858次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>函數</b>—編程中的“積木塊”藝術

    全套C語言培訓資料—PPT課件

    全套C語言培訓資料,共427頁,13個章節:C語言概述、程序的靈魂—算法、數據類型 & 運算符與表達式、順序程序設計、選擇結構程序設計、循環控制、
    發表于 03-12 14:50