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

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

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

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

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

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

C語言函數(shù)為什么不能返回?cái)?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();}

不可以編寫這樣的代碼

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

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

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

C語言沒有嚴(yán)格意義上的“數(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ù)不能返回?cái)?shù)組密切相關(guān)的事實(shí)是,C語言沒有嚴(yán)格意義上的“數(shù)組類型”。可能從C語言代碼角度來看,似乎有數(shù)組類型的變量,但是如果嘗試將該變量像其他變量一樣使用,得到的實(shí)際上是指向數(shù)組第一個(gè)元素的指針。例如下面這段C語言代碼:

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

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

a = &b[0];

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

a = f();

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

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

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

return &ret[0];

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

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

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

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

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

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

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

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

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

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

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

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

小結(jié)

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

聲明:本文內(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語言
    +關(guān)注

    關(guān)注

    180

    文章

    7605

    瀏覽量

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

    關(guān)注

    3

    文章

    4333

    瀏覽量

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

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68688

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言筆試題

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

    同樣是函數(shù),在CC++中有什么區(qū)別

    值,即使沒有數(shù)據(jù)返回,也得寫 void。 第二個(gè)函數(shù)名。 C語言函數(shù)名絕對(duì)不能重名,除了用上
    的頭像 發(fā)表于 11-29 10:25 ?334次閱讀

    C語言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放

    C語言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。 學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C
    的頭像 發(fā)表于 11-27 09:33 ?123次閱讀

    數(shù)組名之間可以直接賦值嗎

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

    C語言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組

    C語言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組
    發(fā)表于 11-20 15:33 ?0次下載

    常用SQL函數(shù)及其用法

    SQL(Structured Query Language)是一種用于管理和操作關(guān)系數(shù)據(jù)庫(kù)的編程語言。SQL 提供了豐富的函數(shù)庫(kù),用于數(shù)據(jù)檢索、數(shù)據(jù)更新、數(shù)據(jù)刪除以及數(shù)據(jù)聚合等操作。以下是一些常用
    的頭像 發(fā)表于 11-19 10:18 ?301次閱讀

    解讀版|Air780E軟件中C語言內(nèi)存數(shù)組的神秘面紗!

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

    使用C語言實(shí)現(xiàn)函數(shù)模板

      用C語言不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?402次閱讀

    C語言指針運(yùn)算符詳解

    C語言中,當(dāng)你有一個(gè)指向數(shù)組中某個(gè)元素的指針時(shí),你可以對(duì)該指針執(zhí)行某些算術(shù)運(yùn)算,例如加法或減法。這些運(yùn)算可以用來遍歷數(shù)組中的元素,如ptr[i]等價(jià)于*(ptr + i)。然而,如果
    的頭像 發(fā)表于 10-30 11:16 ?257次閱讀

    C語言指針詳細(xì)解析

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

    面試常考+1:函數(shù)指針與指針函數(shù)數(shù)組指針與指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針
    的頭像 發(fā)表于 08-10 08:11 ?899次閱讀
    面試常考+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>

    C語言中,同一個(gè)函數(shù)不能被定義兩次?

    稍微有點(diǎn)C語言基礎(chǔ)的同學(xué),一定知道不能這樣做。
    的頭像 發(fā)表于 05-11 18:27 ?1740次閱讀

    嵌入式系統(tǒng)中C語言結(jié)構(gòu)體的基礎(chǔ)實(shí)現(xiàn)與應(yīng)用

    C語言中的數(shù)組只能允許程序員定義存儲(chǔ)相同類型數(shù)據(jù)。但是結(jié)構(gòu)是C語言編程中允許您存儲(chǔ)不同數(shù)據(jù)類型的數(shù)據(jù)。
    發(fā)表于 03-12 14:29 ?510次閱讀
    嵌入式系統(tǒng)中<b class='flag-5'>C</b><b class='flag-5'>語言</b>結(jié)構(gòu)體的基礎(chǔ)實(shí)現(xiàn)與應(yīng)用

    C語言字符串編譯函數(shù)介紹

    C語言中,字符串實(shí)際上是使用null字符O'終止的一維字符數(shù)組。因此,一個(gè)以null結(jié)尾的字符串,包含了組成字符串的字符。
    的頭像 發(fā)表于 03-07 16:18 ?519次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>字符串編譯<b class='flag-5'>函數(shù)</b>介紹

    PHP中數(shù)組的使用方法!

    PHP中數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語言,它的數(shù)組功能非常強(qiáng)大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們?cè)趩蝹€(gè)變量中存儲(chǔ)多個(gè)值。 在本篇文章中,我將詳細(xì)解釋PHP
    的頭像 發(fā)表于 01-12 15:11 ?562次閱讀
    主站蜘蛛池模板: 色偷偷7777www| 亚洲视频区| 欧美尤物射精集锦| 破苞流血哭泣 magnet| 秋霞影院福利电影| 三级网址在线| 午夜福利免费0948视频| 亚洲AV永久无码精品老司机蜜桃| 亚洲aaaa级特黄毛片| 亚洲一区免费在线观看| 1000视频在线播放| 白人大战34厘米黑人BD| 国产成人亚洲精品无广告| 国产一卡 二卡三卡四卡无卡乱码视频 | 国产精品日本不卡一区二区| 国产在线不卡| 榴莲推广APP网站入口官网| 秋秋影视午夜福利高清| 羲义嫁密着中出交尾gvg794| 伊人精品影院一本到综合| 99热在线视频| 国产乱对白精彩在线播放| 久久6699精品国产人妻| 欧美高清18| 午夜看片福利在线观看| 永久免费观看视频| 超碰视频在线观看| 韩国羞羞秘密教学子开车漫书 | chinesevideoshd性舞| 国产精品在线手机视频| 久久精品在现线观看免费15| 欧美牲交A欧美牲交| 校花的奶好大好浪| 5566精品资源在线播放| 国产成年网站v片在线观看| 久久国产精品萌白酱免费| 青草国产超碰人人添人人碱 | 久久综久久美利坚合众国| 日本夜爽爽一区二区三区| 亚洲综合日韩中文字幕v在线| CHINA中国东北GURMA|