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ǔ)言結(jié)構(gòu)體的詳細(xì)資料介紹

Wildesbeast ? 來(lái)源:今日頭條 ? 作者:嵌入式筆記v ? 2020-04-12 12:01 ? 次閱讀

引言

不管什么樣的編程語(yǔ)言,數(shù)據(jù)類型的不斷衍生都是為了不同場(chǎng)合對(duì)其進(jìn)行不同處理或管理。 比如單一的變量,我們可以定義成char, short,,int,float, double等;而如果需要管理多個(gè)同一類型的數(shù)據(jù)就可以使用數(shù)組來(lái)統(tǒng)一管理;那么如果是不同的數(shù)據(jù)類型,但是彼此是相關(guān)聯(lián)的呢? 此時(shí)就可以使用結(jié)構(gòu)體來(lái)統(tǒng)一管理,這也是面對(duì)對(duì)象的基本思想。比如一個(gè)學(xué)生,他有如下信息: 名字(char *), 年齡(uint8), 成績(jī)(float)等。今天我們就來(lái)說(shuō)說(shuō)結(jié)構(gòu)體的基本使用,后續(xù)再深入研究。

結(jié)構(gòu)體的定義

使用struct關(guān)鍵字定義原生結(jié)構(gòu)體類型

struct people{ char name[20]; int age;};

使用typedef類型自定義結(jié)構(gòu)體類型

typedef struct people1{ char name[20]; int age; }people1_t;

兩種方式的有何不同呢? 第一種屬于原生結(jié)構(gòu)體類型,在定義變量之前,都需要加上struct people

struct people p1;

而第二種使用typedef關(guān)鍵字自定義了people_t類型(people1_t等同于struct people1), 即在定義變量時(shí),只需要在變量之前寫上people_t即刻。

people1_t p2;

這兩種方式都可,用戶根據(jù)自己的習(xí)慣選擇其中一種即刻,個(gè)人推薦第二種,定義比較方便~

定義結(jié)構(gòu)體變量和初始化

如上所述,使用第一種struct people定義結(jié)構(gòu)體變量時(shí),有如下方式:

struct people{ char name[20]; int age;};int main(void){ struct people p1; //使用struct people定義變量p1 return 0;}

或:

//定義類型的同時(shí)定義變量struct student{ char name[20]; int age;}std;int main(void){ std.age =23; //直接使用std結(jié)構(gòu)體變量 return 0;}

使用typedef方式定義結(jié)構(gòu)體變量

typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ people1_t p2; return 0;}

接下來(lái)我們?cè)俳榻B結(jié)構(gòu)體的兩種方式初始化:

#include 《stdio.h》#include 《string.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //方式一:在定義的變量的同時(shí)初始化 struct people p1 ={ .name = “xiaoming”, .age = 23 }; people1_t p2; //方式二: 定義變量后,再對(duì)其初始化 strcpy(&p2.name[0], “xiaohong”); p2.age = 45; printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); printf(“p2.name = %s, age = %d. ”, p2.name, p2.age); return 0;}

編譯運(yùn)行:

結(jié)構(gòu)體的元素訪問(wèn)

C語(yǔ)言中有兩種方式訪問(wèn),分別是“?!焙汀?》”, 具體參考如下代碼:

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //定義結(jié)構(gòu)體變量,并初始化 struct people p1 ={ .name = “xiaoming”, .age = 18 }; //定義結(jié)構(gòu)體指針變量 people1_t *p2 = NULL; //申請(qǐng)people1_t結(jié)構(gòu)體大小的堆內(nèi)存空間,并將得到的起始地址賦予p2 p2 = (people1_t *)malloc(sizeof(people1_t)); if(NULL != p2) { //初始化 strcpy(&p2-》name[0], “xiaohong”); p2-》age = 26; } //結(jié)構(gòu)體變量通過(guò)‘。’來(lái)訪問(wèn)其元素 printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); //結(jié)構(gòu)體變量通過(guò)‘-》’來(lái)訪問(wèn)其元素 printf(“p2.name = %s, age = %d. ”, p2-》name, p2-》age);}

編譯運(yùn)行結(jié)果:

以上兩種方式都是使用下標(biāo)式訪問(wèn)結(jié)構(gòu)體元素, 那么如何使用指針?lè)绞皆L問(wèn)呢?

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct my_test{ int a; //4 double b; //8 char c; //1};int main(void){ struct my_test s1; s1.a = 12; s1.b = 3.4; s1.c = ‘a(chǎn)’; int *p1 = (int *)&s1; double *p2 = (double *)((long unsigned int)&s1 + 8); char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); printf(“s1.a = %d. ”, s1.a); printf(“s1.b = %.1f. ”, s1.b); printf(“s1.c = %c. ”, s1.c); printf(“===================== ”); printf(“*p1 = %d. ”, *p1); printf(“*p2 = %.1f. ”, *p2); printf(“*p3 = %c. ”, *p3);}

分析:

int *p1 = (int *)&s1,其中&s1為結(jié)構(gòu)體的起始地址,也是首元素a的地址,因此可以通過(guò)類型轉(zhuǎn)化后賦值給p1(int *類型,指向int類型的變量a)

double *p2 = (double *)((long unsigned int)&s1 + 8); 其中因?yàn)?s1是作為結(jié)構(gòu)體地址,本身是帶有數(shù)據(jù)類型的,我們通過(guò)(long unsigned int)將其轉(zhuǎn)化成普通的長(zhǎng)整型數(shù)值,然后再加上a(8字節(jié))的長(zhǎng)度,之后的地址就是結(jié)構(gòu)體第二個(gè)元素b的地址了,于是乎將得到的地址轉(zhuǎn)化成double *類型賦值給p2,通過(guò)p2來(lái)訪問(wèn)。

char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); 與上步驟分析一致, 首先將&s1轉(zhuǎn)化成普通的普通的長(zhǎng)整型數(shù)值,然后加上元素a 和 元素b的數(shù)據(jù)類型長(zhǎng)度,就得到了元素c的地址,再賦值給p3,通過(guò)p3來(lái)訪問(wèn)結(jié)構(gòu)體元素c。

編譯運(yùn)行結(jié)果:

總結(jié)

從數(shù)組到結(jié)構(gòu)體的進(jìn)步之處:數(shù)組有2個(gè)明顯的缺陷:第一個(gè)是定義時(shí)必須明確給出大小,且這個(gè)大小在以后不能再更改(這里不考慮可變數(shù)組);第二個(gè)是數(shù)組要求所有的元素的類型必須一致。

結(jié)構(gòu)體就完美解決了數(shù)組的第二個(gè)缺陷的,可以將結(jié)構(gòu)體理解為一個(gè)其中元素類型可以不相同的數(shù)組。結(jié)構(gòu)體完全可以取代數(shù)組,只是在數(shù)組可用的范圍內(nèi)數(shù)組比結(jié)構(gòu)體更簡(jiǎn)單,使用更方便。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

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

    關(guān)注

    30

    文章

    4672

    瀏覽量

    67782
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    607

    瀏覽量

    28257
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式中C語(yǔ)言結(jié)構(gòu)基本實(shí)現(xiàn)

    C語(yǔ)言中的數(shù)組只能允許程序員定義存儲(chǔ)相同類型數(shù)據(jù)。但是結(jié)構(gòu)C語(yǔ)言編程中允許您存儲(chǔ)不同數(shù)據(jù)類型的數(shù)據(jù)。
    的頭像 發(fā)表于 05-11 08:49 ?791次閱讀
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>基本實(shí)現(xiàn)

    C語(yǔ)言結(jié)構(gòu)史上最詳細(xì)的講解【軟件干貨】

    struct結(jié)構(gòu)數(shù)據(jù)類型 前言 我們知道,在C語(yǔ)言中有一些基本的數(shù)據(jù)類型,如?char?int?float?long?double?string(
    的頭像 發(fā)表于 03-28 17:52 ?632次閱讀

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

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

    經(jīng)典 C 語(yǔ)言編程,結(jié)構(gòu)和聯(lián)合體如何共用?

    結(jié)構(gòu) 結(jié)構(gòu)占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,結(jié)構(gòu)
    的頭像 發(fā)表于 01-11 18:24 ?1092次閱讀
    經(jīng)典 <b class='flag-5'>C</b> <b class='flag-5'>語(yǔ)言</b>編程,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和聯(lián)合體如何共用?

    結(jié)構(gòu)與指針的關(guān)系

    C語(yǔ)言中,結(jié)構(gòu)(Struct)是一種用戶自定義的數(shù)據(jù)類型,它允許您將不同類型的數(shù)據(jù)項(xiàng)組合在一起,以便形成一個(gè)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
    的頭像 發(fā)表于 01-11 08:00 ?771次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>與指針的關(guān)系

    嵌入式C語(yǔ)言結(jié)構(gòu)特點(diǎn)

    過(guò)程中,不論是基于寄存器開發(fā)還是基于庫(kù)開發(fā),深入理解和掌握嵌入式C語(yǔ)言的函數(shù)、指針、結(jié)構(gòu)是學(xué)習(xí)STM32的關(guān)鍵。嵌入式C
    的頭像 發(fā)表于 11-24 16:16 ?528次閱讀
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>結(jié)構(gòu)</b>特點(diǎn)

    c語(yǔ)言中順序結(jié)構(gòu)的基本流程

    C語(yǔ)言是一種通用的編程語(yǔ)言,注重結(jié)構(gòu)化編程和順序結(jié)構(gòu)。順序結(jié)構(gòu)
    的頭像 發(fā)表于 11-22 10:20 ?788次閱讀

    C語(yǔ)言結(jié)構(gòu)(struct)用法詳解

    在實(shí)際的開發(fā)過(guò)程中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型,此時(shí)數(shù)組是不能夠滿足需求了。因?yàn)閿?shù)組中各元素的類型必須是一致的。為了解決這個(gè)需求,C中給出了另一種數(shù)據(jù)類型-結(jié)構(gòu),每一個(gè)成員可以是任意一種數(shù)據(jù)類型。
    的頭像 發(fā)表于 11-15 16:11 ?1542次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>(struct)用法詳解

    人工智能大模型、應(yīng)用場(chǎng)景、應(yīng)用部署教程超詳細(xì)資料

    人工智能是IC行業(yè)近幾年的熱詞,目前此技術(shù)已經(jīng)有很多成熟的模型和落地案例。在此跟大家做個(gè)分享,更多詳細(xì)資料,請(qǐng)自行搜索:【展銳坦克邦】,坦克邦-智算天地集算法模型、部署說(shuō)明于一,為廣大客戶提供了
    發(fā)表于 11-13 14:49

    C語(yǔ)言條件結(jié)構(gòu)的使用方法

    前面討論了簡(jiǎn)單的條件結(jié)構(gòu)。條件結(jié)構(gòu)用于實(shí)現(xiàn)需要判斷的情況,它以一個(gè)邏輯條件成立與否為條件,決定一個(gè)操作的執(zhí)行或不執(zhí)行,或執(zhí)行兩個(gè)不同的操作。前面介紹的if和if-else結(jié)構(gòu),它是
    發(fā)表于 11-02 11:27 ?847次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>條件<b class='flag-5'>結(jié)構(gòu)</b>的使用方法

    C語(yǔ)言循環(huán)結(jié)構(gòu)的使用方法

    詳細(xì)介紹C語(yǔ)言while循環(huán)結(jié)構(gòu)、do-while循環(huán)結(jié)構(gòu)、for循環(huán)
    發(fā)表于 11-02 11:26 ?1148次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>循環(huán)<b class='flag-5'>結(jié)構(gòu)</b>的使用方法

    單片機(jī)典型實(shí)例介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是初學(xué)者必備單片機(jī)典型實(shí)例包含keil的源代碼+protues仿真圖內(nèi)容包括了:100例8051仿真C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn),proteus仿真實(shí)例,含
    發(fā)表于 10-20 16:32 ?143次下載

    C語(yǔ)言中的結(jié)構(gòu)指針在訪問(wèn)的時(shí)候怎么讀取成員變量的數(shù)據(jù)?

    C語(yǔ)言中的結(jié)構(gòu)指針在訪問(wèn)的時(shí)候怎么讀取成員變量的數(shù)據(jù)
    發(fā)表于 10-10 07:07

    C語(yǔ)言結(jié)構(gòu)講解

    C語(yǔ)言中有一塊極容易被忽略,但是對(duì)于嵌入式編程來(lái)說(shuō)用處特別大的內(nèi)容——結(jié)構(gòu)
    發(fā)表于 10-01 13:27 ?291次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>講解

    無(wú)感無(wú)刷直流電機(jī)如何設(shè)計(jì)電調(diào)的詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是無(wú)感無(wú)刷直流電機(jī)如何設(shè)計(jì)電調(diào)的詳細(xì)資料說(shuō)明。首先要搞清楚一件基本的事情:我們只是來(lái)搞電調(diào)的,而不是去設(shè)計(jì)電機(jī)的。所以不要被一些無(wú)刷電機(jī)教材一上來(lái)那些林林總總的關(guān)于什么磁路
    發(fā)表于 09-26 07:23