91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

C語(yǔ)言結(jié)構(gòu)體用法很多,但是坑也很多

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-01-13 16:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C語(yǔ)言可謂是編程界的傳奇語(yǔ)言,歷經(jīng)幾十年,依然排名前列。 前不久還寫(xiě)了一篇文章《2019年11月C語(yǔ)言接近Java》,說(shuō)了C語(yǔ)言是比較受歡迎的一種語(yǔ)言,有望在年底超過(guò)JAVA,再次成為第一名。 本文主要說(shuō)的是C語(yǔ)言中的結(jié)構(gòu)體,結(jié)構(gòu)體是C語(yǔ)言中重要的一部分內(nèi)容,也是C語(yǔ)言中常用的一種數(shù)據(jù)結(jié)構(gòu)。 一、關(guān)于結(jié)構(gòu)體在C語(yǔ)言中,結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語(yǔ)言中復(fù)合數(shù)據(jù)類(lèi)型(aggregate data type)的一類(lèi)。 結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實(shí)現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時(shí)也是一些元素的集合,這些元素稱(chēng)為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類(lèi)型,成員一般用名字訪問(wèn)。 結(jié)構(gòu)體的定義如下所示:

structtag{member-list}variable-list; 其中:

struct為結(jié)構(gòu)體關(guān)鍵字;

tag為結(jié)構(gòu)體的標(biāo)志;

member-list為結(jié)構(gòu)體成員列表,其必須列出其所有成員;

variable-list為此結(jié)構(gòu)體聲明的變量。

在一般情況下:tag、member-list、variable-list這3部分至少要出現(xiàn)2個(gè)。二、結(jié)構(gòu)體常規(guī)定義不同的定義,應(yīng)用在不同場(chǎng)景,所以,我們編程時(shí)需要結(jié)合實(shí)際情況來(lái)定義結(jié)構(gòu)體。

方法1:

定義結(jié)構(gòu)體stu,此時(shí)結(jié)構(gòu)體相當(dāng)于一個(gè)類(lèi)型,比如int,如需使用此結(jié)構(gòu)體,方法同int.

struct stu{ char aa; short bb;intcc;}; struct stu stu1, stu2;

方法2:

定義結(jié)構(gòu)體stu同時(shí)定義需要使用的結(jié)構(gòu)體變量stu1, stu2。如后面再需要定義結(jié)構(gòu)體變量,方法同1.

struct stu{ char aa; short bb;intcc;}stu1, stu2; struct stu stu3;

方法3:

定義結(jié)構(gòu)體時(shí),結(jié)構(gòu)體名稱(chēng)缺省,同時(shí)定義結(jié)構(gòu)體變量stu1,stu2。但后面不可再定義結(jié)構(gòu)體變量。

struct{ char aa; short bb;intcc;}stu1, stu2;

提示:

這里不能像上面再定義結(jié)構(gòu)體變量:(以下錯(cuò)誤)

structstu3;struct stu stu3;

三、使用typedef定義結(jié)構(gòu)體這里先簡(jiǎn)單說(shuō)下typedef.

在C和C++編程語(yǔ)言中,typedef是一個(gè)關(guān)鍵字。它用來(lái)對(duì)一個(gè)數(shù)據(jù)類(lèi)型取一個(gè)別名,目的是為了使源代碼更易于閱讀和理解。它通常用于簡(jiǎn)化聲明復(fù)雜的類(lèi)型組成的結(jié)構(gòu) ,但它也常常在各種長(zhǎng)度的整數(shù)數(shù)據(jù)類(lèi)型中看到,例如size_t和time_t。 維基百科

方法4:

使用typedef定義結(jié)構(gòu)體同時(shí),給stu結(jié)構(gòu)體別名STU,后續(xù)定義可不用使用struct stu,直接使用STU即可。

typedef struct stu{ char aa; short bb;intcc;}STU; STU stu1;

你會(huì)發(fā)現(xiàn),其實(shí)就是通過(guò)關(guān)鍵字typedef,將STU取代了struct stu。

當(dāng)然,也可以這么用:

struct stu stu1;

上面這種定義就失去了typedef的意思,所以不推薦。

方法5:

使用typedef定義結(jié)構(gòu)體時(shí),省掉結(jié)構(gòu)體第一個(gè)別名stu,直接在后面加STU,使用方法同上。

typedef struct{ char aa; short bb; int cc;}STU; STU stu1;

方法6:

還有一種符合語(yǔ)法規(guī)則,但意義不大的定義方式。

typedef struct stu{ char aa; short bb; int cc;}; struct stu stu1;

以上這些定義方式算是語(yǔ)法的知識(shí),如果還不懂,請(qǐng)?jiān)俅螐?fù)習(xí)一下。

四、結(jié)構(gòu)體大小計(jì)算

結(jié)構(gòu)體的大小,我相信很多人都沒(méi)搞明白。實(shí)際編程中也是很多地方都在應(yīng)用,比如:存儲(chǔ)、拷貝結(jié)構(gòu)體時(shí)都會(huì)牽涉到結(jié)構(gòu)體大小的問(wèn)題。

1.對(duì)比兩結(jié)構(gòu)體大小,一樣嗎?

結(jié)構(gòu)體1:

struct stu{ char aa; short bb; char cc;}stu1;

結(jié)構(gòu)體2:

struct stu{ char aa; char bb; short cc;}stu2;

答案是不一樣。程序測(cè)試得出sizeof(stu1)=6, sizeof(stu2)=4. 2.分析不一樣原因

結(jié)構(gòu)體計(jì)算要遵循字節(jié)對(duì)齊原則,一般滿(mǎn)足三個(gè)準(zhǔn)則:

1)結(jié)構(gòu)體變量的首地址能夠被其最寬基本類(lèi)型成員的大小所整除;

2)結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié);

3)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類(lèi)型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié);

對(duì)于上面結(jié)構(gòu)體stu1來(lái)說(shuō),最大字節(jié):2字節(jié),順序是 char->short->char:

2個(gè)字節(jié)

第一個(gè)char占一個(gè)字節(jié) 多的這一個(gè)補(bǔ)0,只是占位作用
short 剛好占2個(gè)字節(jié)
第二個(gè)char也占1個(gè) 多的這一個(gè)補(bǔ)0


對(duì)于上面結(jié)構(gòu)體stu2來(lái)說(shuō),最大字節(jié):2字節(jié),順序是 char->char->short:

第一個(gè)char占一個(gè)字節(jié) 第二個(gè)char占一個(gè)字節(jié)
short 剛好占2個(gè)字節(jié)

通過(guò)上面兩個(gè)表格,相信你應(yīng)該明白了,改成4字節(jié)的int,原理一樣。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    手把手教你學(xué)51單片機(jī)-C語(yǔ)言

    為何物。要么只是一些很簡(jiǎn)單的小實(shí)驗(yàn),學(xué)完后只能做到點(diǎn)亮個(gè)小燈、顯示個(gè)數(shù)字等,C語(yǔ)言指針都沒(méi)有用到過(guò),綜合實(shí)踐的例子更是一個(gè)沒(méi)有。在學(xué)完這類(lèi)教材后無(wú)法深入下去,很難跟實(shí)際項(xiàng)目開(kāi)發(fā)銜接起來(lái),于是可能會(huì)懷疑
    發(fā)表于 03-05 11:47

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

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

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

    更加的清晰,能使代碼結(jié)構(gòu)的邏輯更加清晰,結(jié)構(gòu)更加好。 那回調(diào)函數(shù)的到底是什么呢?它又是怎么實(shí)現(xiàn)的呢? 這是本次想要簡(jiǎn)單分析的一個(gè)主題。 但是在說(shuō)回調(diào)函數(shù)之前,我覺(jué)得很有必要先說(shuō)明一下
    發(fā)表于 12-30 06:45

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

    class等面向?qū)ο蟮奶匦院蜋C(jī)制。但是,后來(lái)經(jīng)過(guò)一步步修訂和很多次演變,最終才形成了現(xiàn)如今這個(gè)支持一系列重大特性的龐大編程語(yǔ)言。 一、C語(yǔ)言
    發(fā)表于 12-24 07:23

    C語(yǔ)言中一些令人震驚的結(jié)構(gòu)介紹

    C語(yǔ)言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c;
    發(fā)表于 12-23 08:15

    單片機(jī)C語(yǔ)言編程的心得

    寫(xiě)這個(gè)8*8按鍵程序的過(guò)程中,不管是在自己寫(xiě)還是參考別人程序的過(guò)程中,發(fā)現(xiàn)自己對(duì)C語(yǔ)言有些基本知識(shí)點(diǎn)和編程規(guī)范有很多不懂的地方,有些是自己以前的編程習(xí)慣不好,有些就是基礎(chǔ)知識(shí)不扎實(shí)的表現(xiàn),所以總結(jié)
    發(fā)表于 12-08 07:44

    為什么單片機(jī)還在用C語(yǔ)言編程?

    的缺陷 高級(jí)語(yǔ)言存在的目的是可以實(shí)現(xiàn)更為優(yōu)化的算法,更多的是為了方便的執(zhí)行方案,但是,高級(jí)語(yǔ)言對(duì)程序存儲(chǔ)空間的占用要比匯編和C語(yǔ)言
    發(fā)表于 11-28 07:37

    C語(yǔ)言程序的結(jié)構(gòu)

    ,87LPC764有4KB的Flash ROM,而筆者的程序量只有2KB多點(diǎn),因而第一個(gè)想法是改用C語(yǔ)言作為主要的開(kāi)發(fā)語(yǔ)言,應(yīng)該不至于導(dǎo)致代碼空間不夠用。其次,考慮到需要定時(shí)功能的模塊(或稱(chēng)任務(wù),以下統(tǒng)稱(chēng)任務(wù)
    發(fā)表于 11-26 08:12

    C語(yǔ)言的分支結(jié)構(gòu)介紹

    1.簡(jiǎn)單if語(yǔ)句 C語(yǔ)言中的分支結(jié)構(gòu)語(yǔ)句中的if條件語(yǔ)句。 簡(jiǎn)單if語(yǔ)句的基本結(jié)構(gòu)如下: 代碼語(yǔ)言:javascript if(表達(dá)
    發(fā)表于 11-25 07:48

    STM32 5 個(gè)容易踩的外設(shè)使用技巧

    STM32是嵌入式開(kāi)發(fā)領(lǐng)域的熱門(mén)MCU,功能豐富到幾乎可以完成所有常見(jiàn)控制任務(wù):GPIO、ADC、UART、定時(shí)器、DMA……應(yīng)有盡有。但是,正因?yàn)楣δ軓?qiáng)大,開(kāi)發(fā)中踩的機(jī)會(huì)隨之增多。很多
    的頭像 發(fā)表于 11-24 19:04 ?836次閱讀
    STM32 5 個(gè)容易踩<b class='flag-5'>坑</b>的外設(shè)使用技巧

    C語(yǔ)言結(jié)構(gòu)體使用

    型的數(shù)據(jù)組合。 結(jié)構(gòu)體的聲明與定義 結(jié)構(gòu)體的聲明一般形式為: c struct 結(jié)構(gòu)體名{ 成員1; 成員2; ... }; //注意分號(hào) 例如:
    發(fā)表于 11-12 08:30

    C語(yǔ)言的printf基本用法介紹

    中使用頻率最高的一個(gè)函數(shù)一點(diǎn)不為過(guò),每個(gè)C語(yǔ)言程序員都應(yīng)該掌握 printf 的用法,這是最基本的技能。 不過(guò) printf 的用法比較
    發(fā)表于 11-12 07:04

    提高篇——C語(yǔ)言核心技術(shù)(中文版)

    該資料是“C編程語(yǔ)言”和“C語(yǔ)言鏈接庫(kù)”的完整參考手冊(cè)。這本書(shū)的目的是提供一本方便、可靠的手冊(cè),輔助日常的編程工作。本書(shū)描述C
    發(fā)表于 06-13 16:39

    深入理解C語(yǔ)言C語(yǔ)言循環(huán)控制

    C語(yǔ)言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無(wú)限循環(huán),C語(yǔ)言提供了多種循
    的頭像 發(fā)表于 04-29 18:49 ?2061次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)控制

    必看!15個(gè)C語(yǔ)言常見(jiàn)陷阱及避指南

    ? C語(yǔ)言雖強(qiáng)大,但隱藏的“不少!稍不留神就會(huì)導(dǎo)致程序崩潰、數(shù)據(jù)異常。本文整理15個(gè)高頻陷阱,助你寫(xiě)出更穩(wěn)健的代碼! ? 陷阱1:運(yùn)算符優(yōu)先級(jí)混淆? 問(wèn)題:運(yùn)算符優(yōu)先級(jí)不同可能導(dǎo)
    的頭像 發(fā)表于 03-16 12:10 ?1854次閱讀