久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

專欄中心

EEPW首頁 > 專欄 > 【干貨】c語言基礎語法——結構體

【干貨】c語言基礎語法——結構體

發布人:3249821294 時間:2019-10-14 來源:工程師 發布文章

1、關于C語言結構體的引入



在實際問題中有時候我們需要幾種數據類型一起來修飾某個變量。


例如一個學生的信息就需要學號(字符串),姓名(字符串),年齡(整形)等等。


這些數據類型都不同但是他們又是表示一個整體,要存在聯系,那么我們就需要一個新的數據類型。


——結構體,它就將不同類型的數據存放在一起,作為一個整體進行處理。




2、C語言使用結構體變量進一步加強了表示數據的能力



2.1;結構體聲明;



//申明一個結構體 


struct book 


{


char title[MAXTITL];//一個字符串表示的titile 題目 ;


char author[MAXAUTL];//一個字符串表示的author作者 ;


float value;//一個浮點型表示的value價格;


};//注意分號不能少,這也相當于一條語句;


這個聲明描述了一個由兩個字符數組和一個float變量組成的結構體。


但是注意,它并沒有創建一個實際的數據對象,而是描述了一個組成這類對象的元素。


因此,我們有時候也將結構體聲明叫做模板,因為它勾勒出數據該如何存儲,并沒有實例化數據對象。



下面介紹一下上面的結構體聲明;


1、首先使用關鍵字struct,它表示接下來是一個結構體。


2、后面是一個可選的標志(book),它是用來引用該結構體的快速標記。

     

因此我們以后就可以這樣創建數據對象



struct book library;//把library設為一個可以使用book結構體的結構體變量,則library這個變量就包含了其book結構體中的所有元素


3、接下來就是一個花括號,括起了結構體成員列表,及每個成員變量,使用的都是其自己的聲明方式來描述,用分號來結束描述;


例如:char title[MAXTITL];字符數組就是這樣聲明的,用分號結束;

注意:其中每個成員可以使用任何一種C數據結構甚至是其他的結構體,也是可以的;


4、在結束花括號后的分號表示結構體設計定義的結束。


2.2;關于其struct聲明的位置,也就是這段代碼要放到哪里。同樣這也是具有作用域的。


這種聲明如果放在任何函數的外面,那么則可選標記可以在本文件中,該聲明的后面的所有函數都可以使用。


如果這種聲明在某個函數的內部,則它的標記只能在內部使用,并且在其聲明之后;



2.3;關于我們不斷說的,標記名是可選的,那么我們什么時候可以省略,什么時候一定不能省略呢?


如果是上面那種聲明定義的方法,并且想在一個地方定義結構體設計,而在其他地方定義實際的結構體變量,那么就必須使用標記;


可以省略,設計的同時就創建該結構體變量,但是這種設計是一次性的。



關于結構體類型的定義的總結;


一般格式就是;



struct 結構體名(也就是可選標記名){    成員變量;};//使用分號表示定義結束;




3、定義結構體變量



3.1;之前我們結構體類型的定義(結構體的聲明)只是告訴編譯器該如何表示數據,但是它沒有讓計算機為其分配空間。


我們要使用結構體,那么就需要創建變量,也就是結構體變量;


創建一個結構體變量;struct book library;


看到這條指令,編譯器才會創建一個結構體變量library,此時編譯器才會按照book模板為該變量分配內存空間,并且這里存儲空間都是以這個變量結合在一起的。


這也是后面訪問結構體變量成員的時候,我們就要用到結構體變量名來訪問。


分析:


struct book的作用:


在結構體聲明中,struct book所起到的作用就像int,,,,等基礎數據類型名作用一樣。


struct book s1,s2,*ss;


定義兩個struct book結構體類型的結構體變量,還定義了一個指向該結構體的指針,其ss指針可以指向s1,s2,或者任何其他的book結構體變量。


其實;


struct book library;


等效于;


struct book{ 

char … 

…. 

….. 

}librar;

這兩種是等效的,只是第一種可以減少代碼的編寫量;


3.2;現在還是回到剛才提及的那個問題,可選標志符什么時候可以省略;


其一;



struct

{

    char title[MAXTITL]; 

    char author[MAXAUTL];

float value;

}library;

//注意這里不再是定義聲明結構體類型,而是直接創建結構體變量了,這個編譯器會分配內存的;

//這樣的確可以省略標識符也就是結構體名,但是只能使用一次;因為這是;聲明結構體的過程和定義結構體變量的過程和在了一起;并且個成員變量沒有初始化的;

//如果你想多次使用一個結構體模塊,這樣子是行不通的;



其二;



用typedef定義新類型名來代替已有類型名,即給已有類型重新命名;

一般格式為;typedef 已有類型 新類型名;

typedef int Elem; 

typedef struct{

    int date;

    .....

    .....

}STUDENT;

STUDENT stu1,stu2;



總結一下關于結構體變量的定義;


1;先定義結構體類型后再定義結構體變量;


格式為;struct 結構體名 變量名列表;


struct book s1,s2,*ss;//注意這種之前要先定義結構體類型后再定義變量;


2;在定義結構體類型的同時定義結構體變量;


格式為;



struct 結構體名

{

成員列表;

}變量名列表;//這里結構體名是可以省的,但盡量別省;

struct book

{

char title[MAXTITL];//一個字符串表示的titile 題目 ;

char author[MAXAUTL];//一個字符串表示的author作者 ;

float value;//一個浮點型表示的value價格;

}s1,s2



3;直接定義結構體類型變量,就是第二種中省略結構體名的情況;


這種方式不能指明結構體類型名而是直接定義結構體變量,并且在值定義一次結構體變量時適用,無結構體名的結構體類型是無法重復使用的。


也就是說,后面程序不能再定義此類型變量了,除非再寫一次重復的struct。




4、對于結構體變量的初始化



4.1;先回憶一下關于基本數據類型和數組類型的初始化;


int a = 0;


int array[4] = {1,2,3,4};//每個元素用逗號隔開 


回憶一下數組初始化問題;



再回到結構體變量的初始化吧?


關于結構體變量的初始化與初始化數組類似;


也是使用花括號括起來,用逗號分隔的初始化好項目列表,注意每個初始化項目必須要和要初始化的結構體成員類型相匹配。



struct book s1={//對結構體初始化 

        "yuwen",//title為字符串 

        "guojiajiaoyun",//author為字符數組 

        22.5    //value為flaot型 

    };

//要對應起來,用逗號分隔開來,與數組初始化一樣;


4.2;加入一點小知識;


關于結構體初始化和存儲類時期的問題;


如果要初始化一個具有靜態存儲時期的結構體,初始化項目列表中的值必須是常量表達式;



4.3;注意如果在定義結構體變量的時候沒有初始化,那么后面就不能全部一起初始化了;


意思就是;



/////////這樣是可以的,在定義變量的時候就初始化了;

struct book s1={//對結構體初始化 

        "guojiajiaoyun",//author為字符數組 

          "yuwen",//title為字符串 

          22.5

    };

/////////這種就不行了,在定義變量之后,若再要對變量的成員賦值,那么只能單個賦值了;

struct book s1;

    s1={ 

         "guojiajiaoyun",//author為字符數組 

          "yuwen",//title為字符串 

          22.5  

};//這樣就是不行的,只能在定義的時候初始化才能全部賦值,之后就不能再全體賦值了,只能單個賦值;

只能;

s1.title = "yuwen";........//單個賦值;



4.4;對于結構體的指定初始化;






5、訪問結構體成員



5.1;結構體就像一個超級數組,在這個超級數組內,一個元素可以是char類型,下個元素就可以是flaot類型,再下個還可以是int數組型,這些都是存在的。


在數組里面我們通過下標可以訪問一個數組的各個元素,那么如何訪問結構體中的各個成員呢?


用結構成員運算符點(.)就可以了;


結構體變量名.成員名; 


注意,點其結合性是自左至右的,它在所有的運算符中優先級是最高的;



例如,s1.title指的就是s1的title部分,s1.author指的就是s1的author部分,s1.value指的就是s1的value部分。


然后就可以像字符數組那樣使用s1.title,像使用float數據類型一樣使用s1.value;


注意,s1;雖然是個結構體,但是s1.value卻是float型的。


因此s1.value就相當于float類型的變量名一樣,按照float類型來使用;


例如;printf(“%s\n%s\n%f”,s1.title,s1.author,s1.value);//訪問結構體變量元素


注意scanf(“%d”,&s1.value); 這語句存在兩個運算符,&和結構成員運算符點。


按照道理我們應該將(s1。value括起來,因為他們是整體,表示s1的value部分)但是我們不括起來也是一樣的,因為點的優先級要高于&。


5.2;如果其成員本身又是一種結構體類型,那么可以通過若干個成員運算符,一級一級的找到最低一級成員再對其進行操作;


結構體變量名.成員.子成員………最低一級子成員;



struct date

{

    int year;

    int month;

    int day;

};

struct student

{

    char name[10];

    struct date birthday;

}student1;

//若想引用student的出生年月日,可表示為;student.brithday.year;

brithday是student的成員;year是brithday的成員;


5.3;整體與分開


5.3.1;可以將一個結構體變量作為一個整體賦值給另一相同類型的結構體變量,可以到達整體賦值的效果;這個成員變量的值都將全部整體賦值給另外一個變量;


5.3.2;不能將一個結構體變量作為一個整體進行輸入和輸出;在輸入輸出結構體數據時,必須分別指明結構體變量的各成員;


-


總結;除開“相同類型的結構體變量可以相互整體賦值”外,其他情況下,不能整體引用,只能對各個成員分別引用。

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

關鍵詞:

相關推薦

線路板工藝流程介紹

【功能擴展】ASURO智能車玩“警察抓小偷”游戲

視頻 2010-02-01

【CyberSmart】2009年第四屆智能車競賽創意組預賽

視頻 2010-02-01

請高手指路

ygqfb 2004-09-09

【長春大學】飛思卡爾智能車

視頻 2010-02-01

(2024.11.18)半導體一周要聞

ADALM2000實驗:變壓器耦合放大器

基本半導體完成股份改制,正式更名

得益于出口增長,起亞2024年在中國的銷量有所改善

國際視野 2024-11-18

使用iPhone控制智能車

視頻 2010-02-01

TMS320LF240x DSP應用程序設計教程

貿澤開售適用于汽車、音頻、視頻和遙測應用的TI DP83TG721-Q1 1000Base-T1以太網物理層收發器

中南民族大學第三屆飛思卡爾智能車競賽預賽(第一名)

視頻 2010-02-01

發送機基本結構

恩智浦FXLS8971CF和FXLS8961AF加速度傳感器提升您的精密測斜儀應用性能

Waveguide Filters_Cross-Couplings

創新不止 美芝、威靈亮相2024中國家用電器技術大會

英飛凌攜手Stellantis,推動下一代汽車架構的功率轉換和分配創新

10月份巴西汽車銷售創下自2014年12月以來最佳表現

零中頻射頻接收機技術

普華基礎軟件與瑞薩達成合作伙伴關系,推進汽車底層技術革新

更多 培訓課堂
更多 焦點
更多 視頻

技術專區