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

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

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

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

為什么C語(yǔ)言函數(shù)不能返回?cái)?shù)組?

strongerHuang ? 來(lái)源:嵌入式時(shí)代 ? 作者:嵌入式時(shí)代 ? 2021-03-29 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語(yǔ)言函數(shù)可以返回指針、結(jié)構(gòu)體,為什么不能返回?cái)?shù)組? 下面一步一步來(lái)分析:

1

函數(shù)不能返回?cái)?shù)組

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

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

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

2

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

上面代碼其實(shí)就是不能在C語(yǔ)言函數(shù)中返回?cái)?shù)組。但是如果將數(shù)組定義在結(jié)構(gòu)體里面,就可以將其返回了,例如下面這段C語(yǔ)言代碼,請(qǐng)看:

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();}

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

3

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

基本上,C語(yǔ)言中的數(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ù)不能返回?cái)?shù)組密切相關(guān)的事實(shí)是,C語(yǔ)言沒有嚴(yán)格意義上的“數(shù)組類型”??赡軓腃語(yǔ)言代碼角度來(lái)看,似乎有數(shù)組類型的變量。

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

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

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

a = &b[0];

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

a = f();

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

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

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

return &ret[0];

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

4

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

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

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

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

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

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

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

5

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

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

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

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

6

小結(jié)

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

原文標(biāo)題:C語(yǔ)言函數(shù)為什么不能返回?cái)?shù)組?

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    183

    文章

    7643

    瀏覽量

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

    關(guān)注

    3

    文章

    4416

    瀏覽量

    67358

原文標(biāo)題:C語(yǔ)言函數(shù)為什么不能返回?cái)?shù)組?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    傳遞一個(gè)無(wú)符號(hào)的 long 型指針給函數(shù)

    C語(yǔ)言允許傳遞指針給函數(shù),只需要簡(jiǎn)單地聲明函數(shù)參數(shù)為指針類型即可。 下面的實(shí)例中,我們傳遞一個(gè)無(wú)符號(hào)的 long 型指針給函數(shù),并在
    發(fā)表于 01-27 11:51

    指針與函數(shù)詳解

    。 2、函數(shù)指針函數(shù)指針,本質(zhì)上他是一個(gè)指針,并不是一個(gè)函數(shù)。在C語(yǔ)言中有些概念是一脈相承的,之前的推文《指針與
    發(fā)表于 01-23 06:02

    keil中c語(yǔ)言的動(dòng)態(tài)分配內(nèi)存

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

    C語(yǔ)言主要特點(diǎn)

    。 3.數(shù)據(jù)類型豐富。C語(yǔ)言提供的數(shù)據(jù)類型包括整形、浮點(diǎn)型、字符型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型和共用體類型等,C99又?jǐn)U充了復(fù)數(shù)浮點(diǎn)型、超長(zhǎng)整型(long long)和布爾類型(b
    發(fā)表于 01-05 07:41

    C語(yǔ)言函數(shù)指針的六個(gè)高級(jí)的應(yīng)用場(chǎng)景

    process_array 函數(shù),它接受三個(gè)參數(shù):一個(gè)整型數(shù)組數(shù)組大小和一個(gè)函數(shù)指針。函數(shù)指針指向一個(gè)
    發(fā)表于 01-04 12:25

    C語(yǔ)言嵌入式系統(tǒng)編程注意事項(xiàng)-內(nèi)存操作

    字節(jié)為單位編址,而C語(yǔ)言指針以指向的數(shù)據(jù)類型長(zhǎng)度作自增和自減。理解這一點(diǎn)對(duì)于以指針直接操作內(nèi)存是相當(dāng)重要的。 函數(shù)指針 首先要理解以下三個(gè)問題: (1)C
    發(fā)表于 01-04 07:31

    C語(yǔ)言回調(diào)函數(shù)原來(lái)這么簡(jiǎn)單

    ” 這個(gè)概念,它是回調(diào)函數(shù)能夠?qū)崿F(xiàn)的重要基礎(chǔ)。 1、函數(shù)指針學(xué)習(xí)過C語(yǔ)言的伙伴都知道,C語(yǔ)言中的
    發(fā)表于 12-30 06:45

    C語(yǔ)言中實(shí)現(xiàn)函數(shù)宏的三種方式

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

    如何用好 C 語(yǔ)言函數(shù)返回值?

    可能會(huì)比較復(fù)雜,不同的輸入,常常產(chǎn)生不同的輸出結(jié)果。 C語(yǔ)言函數(shù)返回C語(yǔ)言
    發(fā)表于 12-25 07:17

    C語(yǔ)言C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時(shí)什么都不給,默認(rèn)是.cpp。 3、返回C語(yǔ)言中,如果一個(gè)函數(shù)沒有指定返回值類型,默認(rèn)
    發(fā)表于 12-24 07:23

    C語(yǔ)言C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語(yǔ)言是一種面向過程的語(yǔ)言,它強(qiáng)調(diào)的是通過函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++在
    發(fā)表于 12-11 06:23

    C語(yǔ)言的編程技巧

    一個(gè)成員是一個(gè)未知大小的數(shù)組,適用于動(dòng)態(tài)分配內(nèi)存并關(guān)聯(lián)一個(gè)可變長(zhǎng)度的數(shù)組。? ?3、匿名結(jié)構(gòu)體和聯(lián)合體?:C語(yǔ)言允許在結(jié)構(gòu)體或聯(lián)合體中定義不帶標(biāo)簽的內(nèi)部結(jié)構(gòu)體或聯(lián)合體,簡(jiǎn)化代碼結(jié)構(gòu)。
    發(fā)表于 11-27 06:46

    C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們?cè)诠ぷ鞣绞胶桶踩苑矫娲嬖陲@著差異。
    的頭像 發(fā)表于 07-25 15:10 ?1860次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    深入理解C語(yǔ)言函數(shù)—編程中的“積木塊”藝術(shù)

    在編程的世界里,函數(shù)就像建筑中的“積木塊”——它們是構(gòu)建復(fù)雜程序的基石。通過靈活組合這些模塊,開發(fā)者能打造出功能強(qiáng)大且結(jié)構(gòu)清晰的代碼。函數(shù)之所以成為C語(yǔ)言的核心,正是因?yàn)樗鉀Q了編程中
    的頭像 發(fā)表于 06-30 17:26 ?1788次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>函數(shù)</b>—編程中的“積木塊”藝術(shù)

    全套C語(yǔ)言培訓(xùn)資料—PPT課件

    全套C語(yǔ)言培訓(xùn)資料,共427頁(yè),13個(gè)章節(jié):C語(yǔ)言概述、程序的靈魂—算法、數(shù)據(jù)類型 & 運(yùn)算符與表達(dá)式、順序程序設(shè)計(jì)、選擇結(jié)構(gòu)程序設(shè)計(jì)、循環(huán)控制、
    發(fā)表于 03-12 14:50