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

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

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

結(jié)構(gòu)體成員變量的引用方法123

冬至子 ? 來源:小李的創(chuàng)客實驗室 ? 作者:初出茅廬的小李 ? 2023-07-08 14:45 ? 次閱讀

第一種方式“.”引用

第一步:先定義一個結(jié)構(gòu)體

#pragma pack(1) /*1字節(jié)對齊*/
typedef struct 
{
  char xuehao[20];      //學(xué)號
  char xingming[20];    //姓名
  float fenshu;         //分數(shù)
  int age;              //年齡
}student_t;
#pragma pack()/*還原默認對齊*/

這里采用的是常用的typedef關(guān)鍵字進行定義結(jié)構(gòu)體類型,可以看到student_t這種數(shù)據(jù)類型里面有4個成員變量,分別是學(xué)號、姓名、分數(shù)、年齡,這些成員變量既然是變量就應(yīng)該滿足變量的基本特征,也就是說可以被賦值,可以被引用,下面直接看代碼

student_t  stu1, stu2;  //此時stu1,stu2為student_t結(jié)構(gòu)體類型的變量
  
  strcpy(stu1.xingming, "初出茅廬的小李");//數(shù)組變量賦值字符串操作
  strcpy(stu1.xuehao, "10086");          //數(shù)組變量賦值字符串操作
  stu1.fenshu = 99.0;                    //浮點數(shù)賦值操作
  stu1.age = 10;                         //整形數(shù)賦值操作


  strcpy(stu2.xingming, "張三");
  strcpy(stu2.xuehao, "10010");
  stu2.fenshu = 89.5;
  stu2.age = 12;
  //左滑可以查看全部

這里可以看到stu1結(jié)構(gòu)體和stu2結(jié)構(gòu)體的4個成員分別被引用了 引用的格式是:結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名

第二步:打印觀察賦值效果

代碼如下:

printf("\\r\\n\\r\\n**********小李的創(chuàng)客實驗室**********\\r\\n\\r\\n");
  printf("====================================\\r\\n");
  printf("stu1的姓名是:%s\\r\\n", stu1.xingming);
  printf("stu1的學(xué)號是:%s\\r\\n", stu1.xuehao);
  printf("stu1的年齡是:%d\\r\\n", stu1.age);
  printf("stu1的分數(shù)是:%f\\r\\n", stu1.fenshu);
  printf("====================================\\r\\n");
  printf("stu2的姓名是:%s\\r\\n", stu2.xingming);
  printf("stu2的學(xué)號是:%s\\r\\n", stu2.xuehao);
  printf("stu2的年齡是:%d\\r\\n", stu2.age);
  printf("stu2的分數(shù)是:%f\\r\\n", stu2.fenshu);
  printf("====================================\\r\\n");
  //左滑可以查看全部

輸出結(jié)果如下:

圖片

第二種方式“->”引用

下面來看第二種常用的引用方法,這種方法經(jīng)常用做結(jié)構(gòu)體傳參的場合,很多參數(shù)需要傳遞的時候,比如在STM32配置串口波特率、停止位、數(shù)據(jù)位、校驗位、這些參數(shù)的時候就會應(yīng)用到,比較方便只需要一個結(jié)構(gòu)體指針變量就可以訪問結(jié)構(gòu)體的各個成員變量,下面直接來看實例

代碼如下:

void printf_stu(student_t *stu) 
{
  printf("stu的姓名是:%s\\r\\n", stu- >xingming);
  printf("stu的學(xué)號是:%s\\r\\n", stu- >xuehao);
  printf("stu的年齡是:%d\\r\\n", stu- >age);
  printf("stu的分數(shù)是:%f\\r\\n", stu- >fenshu);
}
//左滑可以查看全部

這是一個自定義的打印函數(shù),參數(shù)是student_t類型的指針,也就是結(jié)構(gòu)體變量的一個地址,調(diào)用如下

printf("====================================\\r\\n");
    printf_stu(&stu1);
    printf("====================================\\r\\n");
    printf_stu(&stu2);
//左滑可以查看全部

觀察實驗現(xiàn)象

圖片

可以看出,通過傳入函數(shù)不同的參數(shù),就可以得到不同的輸出這在很多配置參數(shù)的場合就顯得非常重要

舉例說明:

圖片

配置C端口參數(shù)就是傳入這樣一個結(jié)構(gòu)體變量的地址

第三種方式引用

其實這種方式我感覺不常用,但是有助于理解指針變量的真實含義就是指針變量取內(nèi)容的操作,取內(nèi)容取地址是跟指針緊密相關(guān)的知識點這里簡單說一下,以后有時間我們再來詳細探討這里面的細節(jié)。

void printf_stu(student_t *stu) 
{
  printf("stu的姓名是:%s\\r\\n", stu- >xingming);
  printf("stu的學(xué)號是:%s\\r\\n", stu- >xuehao);
  printf("stu的年齡是:%d\\r\\n", stu- >age);
  printf("stu的分數(shù)是:%f\\r\\n", stu- >fenshu);
}
printf_stu(&stu1);
void printf_stu2(student_t *stu) 
{
  printf("stu的姓名是:%s\\r\\n", (*stu).xingming);
  printf("stu的學(xué)號是:%s\\r\\n", (*stu).xuehao);
  printf("stu的年齡是:%d\\r\\n", (*stu).age);
  printf("stu的分數(shù)是:%f\\r\\n", (*stu).fenshu);
}


//左滑可以查看全部

圖片

通過以上對比實驗大家可以發(fā)現(xiàn),其實兩種寫法輸出效果是一樣的,這就說明了取內(nèi)容取地址是互逆的操作。

總結(jié):不管那一種引用方式都是為了應(yīng)用、各種方式都有自己的特點,根據(jù)應(yīng)用場景靈活運用才是正道,至于第二種和第三種的區(qū)別我個人感覺不大,其實我用的最多的還是第一種哈~

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

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353779
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135585
收藏 人收藏

    評論

    相關(guān)推薦

    用C語言的結(jié)構(gòu)實現(xiàn)字節(jié)、位操作

    。那么這個應(yīng)用例將向您介紹一些SPMC75F2413A普遍使用的編程方法。使用結(jié)構(gòu)、聯(lián)合定義位段實現(xiàn)位和字節(jié)的操作。1.2 基本概念結(jié)構(gòu)結(jié)構(gòu)是用同一個名字
    發(fā)表于 09-21 09:25

    C語言結(jié)構(gòu)(struct)常見使用方法

    定義其他同結(jié)構(gòu)變量了——至少我現(xiàn)在沒掌握這種方法。結(jié)構(gòu)
    發(fā)表于 08-23 18:18

    ccs程序在結(jié)構(gòu)后面打上點(.)后結(jié)構(gòu)成員不出現(xiàn)

    在編譯器中定義的結(jié)構(gòu),在結(jié)構(gòu)后面打上點(.)后,結(jié)構(gòu)
    發(fā)表于 09-29 15:05

    Keil5里結(jié)構(gòu)變量成員名自動補全功能不能用了

    Keil5里結(jié)構(gòu)變量成員名自動補全功能不能用了,結(jié)構(gòu)后按。沒有成員名自動出現(xiàn)的功能了,不知道
    發(fā)表于 10-18 08:53

    漫談C語言結(jié)構(gòu)

    ,若發(fā)現(xiàn)不足之處懇請指出。代碼文件test.c我放在下面。(2)以修改結(jié)構(gòu)成員變量方法代替了函數(shù)(入口參數(shù))的重新定義?! ∪绻f
    發(fā)表于 11-15 15:59

    【干貨】c語言基礎(chǔ)語法——結(jié)構(gòu)

    輸入和輸出;在輸入輸出結(jié)構(gòu)數(shù)據(jù)時,必須分別指明結(jié)構(gòu)變量的各成員;-總結(jié);除開“相同類型的
    發(fā)表于 06-03 17:10

    如何利用C語言取結(jié)構(gòu)成員變量的地址?

    C語言,如何取結(jié)構(gòu)成員變量的地址?發(fā)個列程好嗎?我好研究一下
    發(fā)表于 11-04 03:31

    C語言結(jié)構(gòu)的區(qū)別

    結(jié)構(gòu)在使用其某成員變量時用:結(jié)構(gòu)名.結(jié)構(gòu)
    發(fā)表于 03-24 03:27

    結(jié)構(gòu)變量的定義與使用變量訪問結(jié)構(gòu)成員

    知識點回顧關(guān)于找最大公共子串的兩種解題方法結(jié)構(gòu)的定義(3種)結(jié)構(gòu)變量的定義與使用
    發(fā)表于 12-17 07:10

    測試結(jié)構(gòu)成員內(nèi)存對齊的方式方法

    //測試環(huán)境:keil for ARM//測試目的:通過keil仿真,介紹結(jié)構(gòu)成員對齊方式 #pragma pack ()//定義一個聯(lián)合體類型 struct stru {int a;long b
    發(fā)表于 12-21 07:37

    簡單分析linux內(nèi)核中的結(jié)構(gòu)使用方法

    結(jié)構(gòu)的使用并不熟練,導(dǎo)致在linux開發(fā)中一頭霧水。下面簡單分析結(jié)構(gòu)的使用方法。1:結(jié)構(gòu)
    發(fā)表于 01-19 08:26

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

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

    求助,結(jié)構(gòu)變量定義引用問題求解

    |= mask; } 如以上語句,GPIO_Type是個結(jié)構(gòu)定義,定義了一個*base變量,在引用其中的成員時,是base->I
    發(fā)表于 10-27 06:06

    C語言如何定義結(jié)構(gòu)類型變量

    在定義了結(jié)構(gòu)變量后,系統(tǒng)會為之分配內(nèi)存單元。根據(jù)結(jié)構(gòu)類型中包含的成員情況,在Visual C
    的頭像 發(fā)表于 03-10 15:35 ?1131次閱讀

    結(jié)構(gòu)成員變量引用方法

    這里默認大家是了解結(jié)構(gòu)這種數(shù)據(jù)類型的,如果不了解可以參考往期相關(guān)文章,好了下面開始這次的內(nèi)容分享
    發(fā)表于 06-23 17:52 ?4595次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b><b class='flag-5'>成員</b><b class='flag-5'>變量</b>的<b class='flag-5'>引用</b><b class='flag-5'>方法</b>