国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C——Union是什么?Union和Struct這么像,區(qū)別在哪?為什么還要?jiǎng)?chuàng)造出union呢?需要在哪里使用呢?

這篇具有很好參考價(jià)值的文章主要介紹了C——Union是什么?Union和Struct這么像,區(qū)別在哪?為什么還要?jiǎng)?chuàng)造出union呢?需要在哪里使用呢?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在 C 語(yǔ)言中,有一種叫做union的變量,是用來(lái)在不同的情況下,存放不同類型和大小的對(duì)象的變量。這與結(jié)構(gòu)體struct很相似:結(jié)構(gòu)體是一個(gè)或多個(gè)變量的集合。

union 的聲明方式非常簡(jiǎn)單,也與struct一模一樣,如下:

union u_tag {
    int ival;
    char *sval;
} u;

可以看到,唯一的不同就是結(jié)構(gòu)體中的struct變成了union

使用方法也一模一樣:

//一般變量
union_name.val
//指針
union_pointer->val

二者這么像,那么二者的區(qū)別在哪里呢?或者說(shuō),為什么要弄兩個(gè)這么像的東西呢?C 又不是 C++,一些功能是由不同的小組開(kāi)發(fā)的,一些功能上會(huì)重疊。

首先是表面的不同,structunion在使用目的上完全不一樣,union并不像struct會(huì)同時(shí)存放大括號(hào)中列出的每個(gè)變量,如果你嘗試下面的代碼

union u_tag {
    int a;
    int b;
} u;

int main()
{
    u.a=1;
    u.b=2;
    printf("u_tag: %d\n", u.a);
    return 0;
}

那么輸出的結(jié)果為:

u_tag: 2

這里的結(jié)果不是出錯(cuò)了,是因?yàn)?code>union并不會(huì)像結(jié)構(gòu)體一樣,去根據(jù)前面的u.a=1輸出1,由于只能存放一種數(shù)據(jù),所以后面的u.b=2覆蓋了原本u存放的值。

所以說(shuō),union內(nèi)部聲明的變量可以理解成是一種可能,而不是實(shí)際的對(duì)象或成員變量

并且由于union內(nèi)部只有一個(gè)值,所以一般不會(huì)使用相同的數(shù)據(jù)類型。至于目前包含什么數(shù)據(jù)類型,這是編程的時(shí)候需要程序員注意的。一般是用一個(gè)變量u_type,然后再用判斷語(yǔ)句來(lái)判斷當(dāng)前包含的類型。

但是structunion最核心的不同,也是union誕生的理由是:分配空間的機(jī)制。

如果你用sizeof()測(cè)量下面兩個(gè)數(shù)據(jù)的尺寸

union u_tag {
    int ival;
    float fval;
    char *sval;
} u;

struct s_tag {
    int ival;
    float fval;
    char *sval;
} s;

會(huì)發(fā)現(xiàn),u_tag的尺寸是 8 個(gè)字節(jié),但是s_tag的尺寸是 16 個(gè)字節(jié) 。這是因?yàn)?code>union相當(dāng)于給內(nèi)部聲明的數(shù)據(jù)類型留了一個(gè)最大空間,而struct是給每個(gè)數(shù)據(jù)類型都留了各自的空間。

在現(xiàn)在的絕大部分機(jī)器上,int類型為 4 字節(jié),float類型為 4 字節(jié),cahr *類型為 8 個(gè)字節(jié)。所以u就占據(jù)了最大空間,也就是 8 個(gè)字節(jié),而s則每個(gè)都留了各自的空間,也就是 4+4+8=16 字節(jié)。

那么需要在什么時(shí)候使用union呢?
首先根據(jù)其存放一種數(shù)據(jù)的特點(diǎn),可以用來(lái)做一些通用計(jì)算,比如說(shuō)浮點(diǎn)數(shù)和整數(shù)的切換等。
其次上面的使用目的下,節(jié)省空間了。雖然這種情況下也可以使用結(jié)構(gòu)體,但是上面三種數(shù)據(jù)類型就差一倍大小的情況算好的。因?yàn)閮?nèi)存地址分配機(jī)制,一些類型的數(shù)據(jù)的地址是由特殊要求的,比如說(shuō)在一些機(jī)器上,int需要在偶數(shù)位的地址。

下面就是一個(gè)例子,但是整數(shù)的地址限制并不是在偶數(shù),而是 4 的倍數(shù)。

struct s_tag {
    int ival;
    char a;
} s;

這個(gè)結(jié)構(gòu)體的大小為 8 個(gè)字節(jié),你可以自己試試看是不是這個(gè)大小。

并且由于編譯器是順序讀取的,所以如果你寫成下面這樣

struct s_tag {
    int a;
    char b;
    int c;
    char d;
} s;

那么這個(gè)結(jié)構(gòu)體的大小為 16 字節(jié)。這種情況下可以將同一類的數(shù)據(jù)寫在一起,可以節(jié)約一些空間,如下:

struct s_tag {
    int a;
    int c;
    char b;
    char d;
} s;

這樣這個(gè)結(jié)構(gòu)體所占用的空間大小就為 12 字節(jié)了。而如果使用union,那么無(wú)論什么順序,大小一直為 4 字節(jié)。隨著數(shù)據(jù)類型的可能性越來(lái)越多,節(jié)約空間的必要性就凸顯出來(lái)了。

希望能幫到有需要的人~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438762.html

到了這里,關(guān)于C——Union是什么?Union和Struct這么像,區(qū)別在哪?為什么還要?jiǎng)?chuàng)造出union呢?需要在哪里使用呢?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 有了MySQL,為什么還要有NoSQL

    有了MySQL,為什么還要有NoSQL

    ? ? ??今日學(xué)習(xí)目標(biāo): ??MySQL和NoSQL的區(qū)別 ? 創(chuàng)作者 :林在閃閃發(fā)光 ?預(yù)計(jì)時(shí)間:30分鐘 ??個(gè)人主頁(yè):林在閃閃發(fā)光的個(gè)人主頁(yè) ???林在閃閃發(fā)光的個(gè)人社區(qū),歡迎你的加入:?林在閃閃發(fā)光的社區(qū) 目錄 noSQL的大概意思 理論支撐 為什么需要NoSQL 為什么NoSQL有處理超大規(guī)模

    2023年04月20日
    瀏覽(26)
  • CentOS軟件那么老為什么大家還要用它?

    作為一個(gè)專業(yè)的服務(wù)器系統(tǒng),RHEL 系統(tǒng)理論上每一個(gè)軟件包都有 RedHat 內(nèi)部的人員負(fù)責(zé)維護(hù),這個(gè)維護(hù)包括長(zhǎng)期(和系統(tǒng)生命周期一樣長(zhǎng))的開(kāi)發(fā)、更新、測(cè)試、運(yùn)維等。也就是說(shuō)你能從 RHEL 系統(tǒng)源上獲得的每一個(gè)軟件包,出現(xiàn)問(wèn)題都可以找 RedHat 負(fù)責(zé)。所以 RHEL 不可能無(wú)限制

    2024年02月01日
    瀏覽(40)
  • 既然有Map了,為什么還要有Redis?

    既然有Map了,為什么還要有Redis?

    以下內(nèi)容轉(zhuǎn)自掘金 作者:哪吒編程 Redis可以存儲(chǔ)幾十個(gè)G的數(shù)據(jù),Map行嗎? Redis的緩存可以進(jìn)行本地持久化,Map行嗎? Redis可以作為分布式緩存,Map只能在同一個(gè)JVM中進(jìn)行緩存; Redis支持每秒百萬(wàn)級(jí)的并發(fā),Map行嗎? Redis有過(guò)期機(jī)制,Map有嗎? Redis有豐富的API,支持非常多的應(yīng)

    2024年02月03日
    瀏覽(26)
  • 既然有HTTP協(xié)議,為什么還要有RPC?

    既然有HTTP協(xié)議,為什么還要有RPC?

    我想起了我剛工作的時(shí)候,第一次接觸RPC協(xié)議,當(dāng)時(shí)就很懵, 我HTTP協(xié)議用得好好的,為什么還要用RPC協(xié)議? ? 于是就到網(wǎng)上去搜。 ? 不少解釋顯得非常官方,我相信大家在各種平臺(tái)上也都看到過(guò),解釋了又好像沒(méi)解釋,都在 用一個(gè)我們不認(rèn)識(shí)的概念去解釋另外一個(gè)我們不

    2024年02月09日
    瀏覽(32)
  • 既然有 HTTP 協(xié)議,為什么還要有 RPC

    既然有 HTTP 協(xié)議,為什么還要有 RPC

    什么是HTTP HTTP 協(xié)議( H yper T ext T ransfer P rotocol),又叫做 超文本傳輸協(xié)議 。平時(shí)上網(wǎng)在瀏覽器上敲個(gè)網(wǎng)址就能訪問(wèn)網(wǎng)頁(yè),這里用到的就是HTTP協(xié)議。 什么是RPC RPC ( R emote P rocedure C all),又叫做 遠(yuǎn)程過(guò)程調(diào)用 。它并不是一個(gè)具體的協(xié)議,而是一種 調(diào)用方式 。 像之前的單體

    2024年02月09日
    瀏覽(35)
  • 云服務(wù)器那么安全穩(wěn)定,為什么大廠還要自建機(jī)房

    云服務(wù)器那么安全穩(wěn)定,為什么大廠還要自建機(jī)房

    一般來(lái)說(shuō)選擇自建機(jī)房或者是云服務(wù)商要考慮的幾個(gè)問(wèn)題 成本 安全性 管理 通常來(lái)說(shuō)自建機(jī)房,需要自己考慮很多問(wèn)題,比如 電費(fèi) 網(wǎng)絡(luò) Raid 可靠性 安全性 還要計(jì)算運(yùn)維的成本 似乎從哪個(gè)角度來(lái)說(shuō),自建機(jī)房都是不大劃算的。 但是為什么還有一些公司要自建機(jī)房呢? 首先

    2023年04月08日
    瀏覽(31)
  • 【容器架構(gòu)】你知道有 Docker 為什么還要 K8s 嗎?

    【容器架構(gòu)】你知道有 Docker 為什么還要 K8s 嗎?

    ?? 博主介紹 : 博主從事應(yīng)用安全和大數(shù)據(jù)領(lǐng)域,有8年研發(fā)經(jīng)驗(yàn),5年面試官經(jīng)驗(yàn),Java技術(shù)專家,WEB架構(gòu)師,阿里云專家博主,華為云云享專家,51CTO TOP紅人 Java知識(shí)圖譜點(diǎn)擊鏈接: 體系化學(xué)習(xí)Java(Java面試專題) ???? 感興趣的同學(xué)可以收藏關(guān)注下 , 不然下次找不到喲

    2024年02月16日
    瀏覽(22)
  • Netty為什么高效,為什么這么受歡迎?

    Netty為什么高效,為什么這么受歡迎?

    上篇文章通過(guò) Java NIO 的處理流程與 Netty 的總體流程比較,并結(jié)合 Netty 的源碼,可以更加清晰地理解Netty。本文將結(jié)合源碼詳細(xì)解析Netty的高效和強(qiáng)大功能的設(shè)計(jì)原理,學(xué)習(xí) Netty 是如何實(shí)現(xiàn)其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的設(shè)計(jì)思想。 我們先看

    2024年02月12日
    瀏覽(41)
  • 為什么需要分布式存儲(chǔ)技術(shù)?IPFS價(jià)值在哪?

    為什么需要分布式存儲(chǔ)技術(shù)?IPFS價(jià)值在哪?

    IPFS中文翻譯是星際文件系統(tǒng),是硬盤共享的互聯(lián)網(wǎng)底層協(xié)議,主要用于訪問(wèn)數(shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),IPFS可以創(chuàng)建一個(gè)存儲(chǔ)網(wǎng)絡(luò),讓更多的人在分享閑置存儲(chǔ)空間的同時(shí)獲得收入。 這種人人都可以參與共享硬盤的存儲(chǔ)模式,稱為分布式存儲(chǔ)。為什么我們需要這種分布式存儲(chǔ)技術(shù)?要

    2024年02月13日
    瀏覽(28)
  • 區(qū)塊鏈到底是什么,為什么這么火爆

    區(qū)塊鏈到底是什么,為什么這么火爆

    一、相關(guān)背景介紹 互聯(lián)網(wǎng)上的貿(mào)易,幾乎都需要借助可資信賴的第三方信用機(jī)構(gòu)來(lái)處理電子支付信息。這類系統(tǒng)仍然內(nèi)生性地受制于“基于信用的模式”。 區(qū)塊鏈技術(shù)是構(gòu)建比特幣區(qū)塊鏈網(wǎng)絡(luò)與交易信息加密傳輸?shù)幕A(chǔ)技術(shù)。它基于密碼學(xué)原理而不基于信用,使得任何達(dá)成

    2023年04月08日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包