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

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

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

結(jié)構(gòu)體基本用法詳解

CHANBAEK ? 來源:博客園-lzh666 ? 作者:博客園-lzh666 ? 2023-02-15 14:52 ? 次閱讀

結(jié)構(gòu)體詳解

結(jié)構(gòu)體基本用法:

結(jié)構(gòu)體就是把相同或者不同類型的便利放到一起,這和C++中的類很像,但沒有c++那么復(fù)雜,C語言中的結(jié)構(gòu)體申明如下:

struct student           //結(jié)構(gòu)體名
{
    char   name[10];     //姓名
    int    number;       //編號
    int    grade;        //成績
};

申明很簡單,其內(nèi)存是按順序放置的。

下面需要注意的幾點(diǎn):

1.申明時不能初始化(為什么后面會講)

2.申明只是申明一個結(jié)構(gòu)體,是不能使用的

3.獲取結(jié)構(gòu)體大小可以用sizeof(struct student)

4.結(jié)構(gòu)體可以嵌套定義

5.結(jié)構(gòu)體大小必須是所有成員變量大小的整數(shù)倍

一般我們會使用新定義類型來代替結(jié)構(gòu)體,其實(shí)就是給結(jié)構(gòu)體起一個新的名字

typedef  struct student
{
     char     name[10];
     int      number;
     int      grade;
}STU;

STU stu1={"張三",001,95};//定義一個stu1結(jié)構(gòu)體變量,并進(jìn)行初始化

注意:只有在定義的時候才能一起初始化,一旦定義了之后,不能一起初始化,但是可以分別初始化,為啥之后不能初始化,主要原因是因?yàn)榻Y(jié)構(gòu)體變量是按順序存儲的。

這樣STU表示的實(shí)際就是結(jié)構(gòu)體,具體可以參考typedef用法。

結(jié)構(gòu)體既然申明了那怎么使用了,這里我們必須定義一個結(jié)構(gòu)體變量,注意是結(jié)構(gòu)體變量,也就是定義一個變量,這里的變量的類型是結(jié)構(gòu)體,因此結(jié)構(gòu)體申明部分其實(shí)就是申明一個新的變量類型,因此結(jié)構(gòu)體是一個類型,不是變量,所以這也就是為啥申明的時候里面不能進(jìn)行初始化的原因。 下面舉個例子來使用結(jié)構(gòu)體:

我們引用結(jié)構(gòu)體是可以這樣引用:
stu1.name="李四";
stu1.number=002;
stu1.grade=100;
上面的引用方式是成員引用,也就是普通變量方式引用,還有一種引用就是結(jié)構(gòu)體指針引用,這兩種引用的方式有很大不同,后面會講到。
指針引用時必須申明一個結(jié)構(gòu)體指針,就像在整型變量中使用指針一樣,我們需要先定義一個整型指針變量,然后使用它,這里也是一樣。
STU  *stu2;   //定義一個stu2結(jié)構(gòu)體指針變量

上面不能進(jìn)行初始化,因?yàn)槠鋵?shí)質(zhì)是一個指針,不能像變量一樣可以一起初始化(當(dāng)然,指針實(shí)質(zhì)還是變量,但是其使用不一樣,所以一般說指針還是指指針變量)

既然是指針,那么必須指向一個內(nèi)存地址,因此指針變量使用之前必須指向一塊特定的內(nèi)存地址,結(jié)構(gòu)體指針也不例外。 那我們怎樣初始化結(jié)構(gòu)體指針呢

第一種方式用動態(tài)分配內(nèi)存的方式:

stu2=(STU*)malloc(STU);

第二種方式使用結(jié)構(gòu)體變量間接方式:

stu2=&stu1;

這樣結(jié)構(gòu)體stu2指向的就是stu1的首地址。

結(jié)構(gòu)體高級用法:

在函數(shù)中,如果參數(shù)是結(jié)構(gòu)體,那么又該怎樣使用呢,其實(shí)我們使用結(jié)構(gòu)體和使用變量是一樣的,定義如下

void swap(STU stu1,STU stu2)
{
   int exchange=0;
   exchange = stu1.grade;
   stu1.grade=stu2.grade;
   stu2.grade=exchange;
   /******
    ......
   ******/
}

這樣就可以使用結(jié)構(gòu)體變量了,但是請思考下面代碼結(jié)果:

STU stu3={"王五",003,80};
swap(stu1,stu3);

執(zhí)行這個函數(shù)兩個結(jié)構(gòu)體中的grade會交換么? 結(jié)果是不會。 這里就和函數(shù)中講解的是一樣的,那么我們怎么才能將其交換呢,在普通函數(shù)中給的方法是使用指針,因此這里我們同樣可以使用指針來操作,我們必須將函數(shù)的形參定義為結(jié)構(gòu)體指針變量。 如下:

STU swap(STU *stu1,STU *stu2)
{
    int exchange=0;
    exchange = stu1->grade;
    stu1->grade=stu2->grade;
    stu2->grade=exchange;

}

這樣我們使用

swap(&stu1,&stu3);

就可以將其調(diào)換位置了

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

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134048
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

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

    關(guān)注

    0

    文章

    607

    瀏覽量

    28257
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10800
收藏 人收藏

    評論

    相關(guān)推薦

    C語言中結(jié)構(gòu)struct的用法

    結(jié)構(gòu)數(shù)組就是具有相同結(jié)構(gòu)類型的變量集合,假如要定義一個班級40個同學(xué) 的姓名、性別、年齡和住址, 可以定義成一個結(jié)構(gòu)數(shù)組。如下所示:
    的頭像 發(fā)表于 03-31 11:45 ?3506次閱讀

    結(jié)構(gòu)使用方法

    雖然粉絲最后都理解了,但是仍想趁著這個機(jī)會整理一下結(jié)構(gòu)用法,希望能夠?qū)側(cè)胄械耐瑐冇兴鶐椭?/div>
    的頭像 發(fā)表于 09-28 15:43 ?1509次閱讀

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

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

    C語言-結(jié)構(gòu)對齊詳解

    `C語言-結(jié)構(gòu)對齊詳解朱有鵬1、結(jié)構(gòu)為何要對齊訪問訪問結(jié)構(gòu)
    發(fā)表于 07-12 16:41

    如何定義結(jié)構(gòu)?

    什么是結(jié)構(gòu),如何定義結(jié)構(gòu)? 溫馨提示: 請從以下鏈接中的帖子學(xué)習(xí)相關(guān)內(nèi)容并進(jìn)行回答,其他地方得到的答案不能作為標(biāo)準(zhǔn)答案,僅能做為補(bǔ)充說明,七天之內(nèi)答案不可見,答題的童鞋有七天
    發(fā)表于 05-08 05:55

    一文詳解ADC的外圍功能與結(jié)構(gòu)

    本文主要從ADC中用到的結(jié)構(gòu)、函數(shù)以及用法進(jìn)行講解
    發(fā)表于 01-25 07:05

    USART初始化結(jié)構(gòu)詳解

    USART 初始化結(jié)構(gòu)詳解標(biāo)準(zhǔn)庫函數(shù)對每個外設(shè)都建立了一個初始化結(jié)構(gòu),比如USART_InitTypeDef,
    發(fā)表于 02-22 06:08

    請教下有沒有好的用法可以將結(jié)構(gòu)和easyflash結(jié)合進(jìn)行使用?

    以往的FLASH存儲信息,是使用結(jié)構(gòu)先進(jìn)行分類,在通過flash寫入庫函數(shù)進(jìn)行存儲,而且使用的范圍比較廣如果使用easyflash是進(jìn)行鍵值的改動,改動的代碼量會比較大,請教下有沒有好的用法可以將
    發(fā)表于 02-13 14:41

    OrCAD中創(chuàng)建總線及用法詳解

    OrCAD中創(chuàng)建總線及用法詳解,如何創(chuàng)建總線,菜單place->bus或者右側(cè)快捷按鈕
    發(fā)表于 12-02 10:18 ?2.6w次閱讀

    c語言_結(jié)構(gòu)和共同體

    這份PPT很全面講解了結(jié)構(gòu)的各種用法,夠全面,對結(jié)構(gòu)的各種應(yīng)用也舉了例子,本人已驗(yàn)證過的!另外也講解了共同體和枚舉,這兩部分描述較少。
    發(fā)表于 06-15 10:58 ?0次下載

    Typedef用法小結(jié)

    非常不錯的文檔有著基本數(shù)據(jù)類型結(jié)構(gòu)enum與函數(shù)指針等等的Typedef相關(guān)用法.
    發(fā)表于 11-02 11:36 ?19次下載

    ADC0809用法詳解_引腳圖及功能_工作原理_內(nèi)部結(jié)構(gòu)及應(yīng)用電路

    本文主要介紹了ADC0809用法詳解_引腳圖及功能_工作原理_內(nèi)部結(jié)構(gòu)及應(yīng)用電路。ADC0809是采用CMOS工藝制造的雙列直插式單片8位A/D轉(zhuǎn)換器。A/D轉(zhuǎn)換后得到的數(shù)據(jù)應(yīng)及時傳送給單片機(jī)進(jìn)行處理。
    發(fā)表于 12-13 09:32 ?19.2w次閱讀
    ADC0809<b class='flag-5'>用法</b><b class='flag-5'>詳解</b>_引腳圖及功能_工作原理_內(nèi)部<b class='flag-5'>結(jié)構(gòu)</b>及應(yīng)用電路

    XMEGA PWM模塊多通道的用法詳解

    本文主要詳解XMEGA PWM模塊多通道的用法,具體的跟隨小編來了解一下。
    的頭像 發(fā)表于 06-18 14:09 ?4204次閱讀
    XMEGA PWM模塊多通道的<b class='flag-5'>用法</b><b class='flag-5'>詳解</b>

    CMake用法詳解

    CMake用法詳解
    發(fā)表于 10-25 16:28 ?2次下載

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

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