新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機之C語言-4.3結構體

        51單片機之C語言-4.3結構體

        作者: 時間:2016-11-21 來源:網絡 收藏
        既然既然相同長度單元格能放在一起,比如char1,char2,char3; int1,int2,int3; long1,long2,long3.在實際使用中,有些變量長度是不一樣的,但由于它們之間相互關聯也需要放在一起,那么要是不同長度的變量,想放在一起有沒有辦法呢?當然可以,這個就叫做結構體。現在按照數組的學習方法來研究結構體,兩個問題,如何定義;如何訪問結構體成員。

        (1) 如何定義一個結構體

        本文引用地址:http://www.104case.com/article/201611/319552.htm

        定義一個結構的一般形式為:

        struct結構名

        {成員表列};

        成員表列由若干個成員組成,每個成員都是該結構的一個組成部分。對每個成員也必須作類型說明,其形式為:

        類型說明符成員名;

        成員名的命名應符合標志符的書寫規定。例如:

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        }

        由以上可見,通過struct來定義一個結構體名,然后描述這個結構體中各個成員。struct stu類似于int或者char.為什么這么講呢?我們來看看char是什么,char就是固定化的存儲空間,一個字節,int就是固定的兩個字節。我們知道變量是多樣化的,現在我需要的變量既不是int 也不是char,而是int和char的綜合,那怎么辦?這個就是結構體了。簡單的講,int,char是固定好的存儲空間劃分,struct stu是自定義存儲空間劃分。類似于很多軟件中有默認的設置,還有自定義設置。了解這點,我們來看看如何定義結構體變量:

        先來深入了解一下前面我們是怎么定義變量的?比如char mystring, int mydata.這個是先劃分存儲空間然后,再給這個空間命名。比如char先要一個一個字節的單元格,然后給這個字節取個名字叫mystring,同樣int就是先要2個字節的單元格,然后給這兩個字節取個名字叫mydata. 同樣對于結構體變量,我們先要一個存儲空間,然后給這個空間取個名字。這個存儲空間可以任意由你定義。比如struct stu.然后給這個空間取個名字,比如boy1.因此我們就知道了如何定義一個結構體變量。與其他變量并無區別。

        struct stu boy1,boy2;等等。這里小結一下,結構體變量定義一共有三種方法:

        1)先定義結構,再說明結構變量

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        }

        struct stu boy1,boy2;

        2) 在定義結構類型的同時說明結構變量

        struct stu

        {

        int num;

        char name[20];

        char sex;

        float score;

        }boy1,boy2;

        3)直接說明結構變量

        struct

        {

        int num;

        char name[20];

        char sex;

        float score;

        }boy1,boy2;

        第3種方法中省去了結構名。

        (2)結構變量的初始化

        和其他類型變量一樣,對結構變量可以在定義時進行初始化賦值。

        那么結構體的成員能否為數組?當然可以。我們來看看如何在結構體成員中讓某個成員為數組

        struct mystruct {

        int age;

        int score;

        char sex;

        char myarry[3];

        };

        struct mystruct boy1;

        void main(void)

        {

        boy1.myarry[0]=4;

        boy1.myarry[1]=2;

        boy1.myarry[2]=3;

        }

        這中方法是通過給數組的成員一個一個賦值

        (3) 結構體成員的訪問

        那么如何訪問結構體中的成員呢?我們訪問數組的時候,比如數組a[4],我要訪問第三個成員,那么直接使用a[2],就可以了。那么訪問結構體成員,使用結構體變量加成員名,比如:

        boy1.num

        boy2.name

        boy1.birthday.month

        與普通變量完全相同。

        #include "reg52.h"

        typedef unsigned char uchar;

        void delayUs(uchar t);

        void delayMs(uchar t);

        void main (void)

        {

        struct MyStruct

        {

        uchar DATA0;

        uchar DATA1;

        uchar DATA2;

        uchar DATA3;

        uchar DATA4;

        uchar DATA5;

        uchar DATA6;

        uchar DATA7;

        };

        struct MyStruct MyData;

        MyData.DATA0=0xfe;//點亮第1個LED

        MyData.DATA1=0xfd;//點亮第2個LED燈

        MyData.DATA2=0xfb;//點亮第3個LED燈

        MyData.DATA3=0xf7;//點亮第4個LED燈

        MyData.DATA4=0xef;//點亮第5個LED燈

        MyData.DATA5=0xdf;//點亮第6個LED燈

        MyData.DATA6=0xbf;//點亮第7個LED燈

        MyData.DATA7=0x7f;//點亮第8個LED燈

        while(1)

        {

        P1=MyData.DATA0;//點亮第1個LED燈

        delayMs(100);

        P1=MyData.DATA1;//點亮第2個LED燈

        delayMs(100);

        P1=MyData.DATA2;//點亮第3個LED燈

        delayMs(100);

        P1=MyData.DATA3;//點亮第4個LED燈

        delayMs(100);

        P1=MyData.DATA4;//點亮第5個LED燈

        delayMs(100);

        P1=MyData.DATA5;//點亮第6個LED燈

        delayMs(100);

        P1=MyData.DATA6;//點亮第7個LED燈

        delayMs(100);

        P1=MyData.DATA7;//點亮第8個LED燈

        delayMs(100);

        }

        }

        void delayUs(uchar t)

        {

        while(--t);

        }

        void delayMs(uchar t)

        {

        while(--t)

        {

        delayUs(245);

        delayUs(245);

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 淳安县| 四会市| 临潭县| 临江市| 青神县| 石林| 呼伦贝尔市| 门源| 景谷| 新河县| 柘荣县| 洪江市| 织金县| 双城市| 饶阳县| 沁水县| 威宁| 文化| 三明市| 女性| 大化| 镇康县| 镇江市| 车险| 岳阳县| 乐亭县| 罗甸县| 濮阳市| 历史| 兖州市| 扶余县| 嘉禾县| 札达县| 利辛县| 福泉市| 江孜县| 天津市| 鄂州市| 谷城县| 衡山县| 元谋县|