"); //-->
1、關(guān)于C語言結(jié)構(gòu)體的引入
在實(shí)際問題中有時(shí)候我們需要幾種數(shù)據(jù)類型一起來修飾某個(gè)變量。
例如一個(gè)學(xué)生的信息就需要學(xué)號(hào)(字符串),姓名(字符串),年齡(整形)等等。
這些數(shù)據(jù)類型都不同但是他們又是表示一個(gè)整體,要存在聯(lián)系,那么我們就需要一個(gè)新的數(shù)據(jù)類型。
——結(jié)構(gòu)體,它就將不同類型的數(shù)據(jù)存放在一起,作為一個(gè)整體進(jìn)行處理。
2、C語言使用結(jié)構(gòu)體變量進(jìn)一步加強(qiáng)了表示數(shù)據(jù)的能力
2.1;結(jié)構(gòu)體聲明;
//申明一個(gè)結(jié)構(gòu)體
struct book
{
char title[MAXTITL];//一個(gè)字符串表示的titile 題目 ;
char author[MAXAUTL];//一個(gè)字符串表示的author作者 ;
float value;//一個(gè)浮點(diǎn)型表示的value價(jià)格;
};//注意分號(hào)不能少,這也相當(dāng)于一條語句;
這個(gè)聲明描述了一個(gè)由兩個(gè)字符數(shù)組和一個(gè)float變量組成的結(jié)構(gòu)體。
但是注意,它并沒有創(chuàng)建一個(gè)實(shí)際的數(shù)據(jù)對(duì)象,而是描述了一個(gè)組成這類對(duì)象的元素。
因此,我們有時(shí)候也將結(jié)構(gòu)體聲明叫做模板,因?yàn)樗蠢粘鰯?shù)據(jù)該如何存儲(chǔ),并沒有實(shí)例化數(shù)據(jù)對(duì)象。
下面介紹一下上面的結(jié)構(gòu)體聲明;
1、首先使用關(guān)鍵字struct,它表示接下來是一個(gè)結(jié)構(gòu)體。
2、后面是一個(gè)可選的標(biāo)志(book),它是用來引用該結(jié)構(gòu)體的快速標(biāo)記。
因此我們以后就可以這樣創(chuàng)建數(shù)據(jù)對(duì)象
struct book library;//把library設(shè)為一個(gè)可以使用book結(jié)構(gòu)體的結(jié)構(gòu)體變量,則library這個(gè)變量就包含了其book結(jié)構(gòu)體中的所有元素
3、接下來就是一個(gè)花括號(hào),括起了結(jié)構(gòu)體成員列表,及每個(gè)成員變量,使用的都是其自己的聲明方式來描述,用分號(hào)來結(jié)束描述;
例如:char title[MAXTITL];字符數(shù)組就是這樣聲明的,用分號(hào)結(jié)束;
注意:其中每個(gè)成員可以使用任何一種C數(shù)據(jù)結(jié)構(gòu)甚至是其他的結(jié)構(gòu)體,也是可以的;
4、在結(jié)束花括號(hào)后的分號(hào)表示結(jié)構(gòu)體設(shè)計(jì)定義的結(jié)束。
2.2;關(guān)于其struct聲明的位置,也就是這段代碼要放到哪里。同樣這也是具有作用域的。
這種聲明如果放在任何函數(shù)的外面,那么則可選標(biāo)記可以在本文件中,該聲明的后面的所有函數(shù)都可以使用。
如果這種聲明在某個(gè)函數(shù)的內(nèi)部,則它的標(biāo)記只能在內(nèi)部使用,并且在其聲明之后;
2.3;關(guān)于我們不斷說的,標(biāo)記名是可選的,那么我們什么時(shí)候可以省略,什么時(shí)候一定不能省略呢?
如果是上面那種聲明定義的方法,并且想在一個(gè)地方定義結(jié)構(gòu)體設(shè)計(jì),而在其他地方定義實(shí)際的結(jié)構(gòu)體變量,那么就必須使用標(biāo)記;
可以省略,設(shè)計(jì)的同時(shí)就創(chuàng)建該結(jié)構(gòu)體變量,但是這種設(shè)計(jì)是一次性的。
關(guān)于結(jié)構(gòu)體類型的定義的總結(jié);
一般格式就是;
struct 結(jié)構(gòu)體名(也就是可選標(biāo)記名){ 成員變量;};//使用分號(hào)表示定義結(jié)束;
3、定義結(jié)構(gòu)體變量
3.1;之前我們結(jié)構(gòu)體類型的定義(結(jié)構(gòu)體的聲明)只是告訴編譯器該如何表示數(shù)據(jù),但是它沒有讓計(jì)算機(jī)為其分配空間。
我們要使用結(jié)構(gòu)體,那么就需要?jiǎng)?chuàng)建變量,也就是結(jié)構(gòu)體變量;
創(chuàng)建一個(gè)結(jié)構(gòu)體變量;struct book library;
看到這條指令,編譯器才會(huì)創(chuàng)建一個(gè)結(jié)構(gòu)體變量library,此時(shí)編譯器才會(huì)按照book模板為該變量分配內(nèi)存空間,并且這里存儲(chǔ)空間都是以這個(gè)變量結(jié)合在一起的。
這也是后面訪問結(jié)構(gòu)體變量成員的時(shí)候,我們就要用到結(jié)構(gòu)體變量名來訪問。
分析:
struct book的作用:
在結(jié)構(gòu)體聲明中,struct book所起到的作用就像int,,,,等基礎(chǔ)數(shù)據(jù)類型名作用一樣。
struct book s1,s2,*ss;
定義兩個(gè)struct book結(jié)構(gòu)體類型的結(jié)構(gòu)體變量,還定義了一個(gè)指向該結(jié)構(gòu)體的指針,其ss指針可以指向s1,s2,或者任何其他的book結(jié)構(gòu)體變量。
其實(shí);
struct book library;
等效于;
struct book{
char …
….
…..
}librar;
這兩種是等效的,只是第一種可以減少代碼的編寫量;
3.2;現(xiàn)在還是回到剛才提及的那個(gè)問題,可選標(biāo)志符什么時(shí)候可以省略;
其一;
struct
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}library;
//注意這里不再是定義聲明結(jié)構(gòu)體類型,而是直接創(chuàng)建結(jié)構(gòu)體變量了,這個(gè)編譯器會(huì)分配內(nèi)存的;
//這樣的確可以省略標(biāo)識(shí)符也就是結(jié)構(gòu)體名,但是只能使用一次;因?yàn)檫@是;聲明結(jié)構(gòu)體的過程和定義結(jié)構(gòu)體變量的過程和在了一起;并且個(gè)成員變量沒有初始化的;
//如果你想多次使用一個(gè)結(jié)構(gòu)體模塊,這樣子是行不通的;
其二;
用typedef定義新類型名來代替已有類型名,即給已有類型重新命名;
一般格式為;typedef 已有類型 新類型名;
typedef int Elem;
typedef struct{
int date;
.....
.....
}STUDENT;
STUDENT stu1,stu2;
總結(jié)一下關(guān)于結(jié)構(gòu)體變量的定義;
1;先定義結(jié)構(gòu)體類型后再定義結(jié)構(gòu)體變量;
格式為;struct 結(jié)構(gòu)體名 變量名列表;
struct book s1,s2,*ss;//注意這種之前要先定義結(jié)構(gòu)體類型后再定義變量;
2;在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量;
格式為;
struct 結(jié)構(gòu)體名
{
成員列表;
}變量名列表;//這里結(jié)構(gòu)體名是可以省的,但盡量別省;
struct book
{
char title[MAXTITL];//一個(gè)字符串表示的titile 題目 ;
char author[MAXAUTL];//一個(gè)字符串表示的author作者 ;
float value;//一個(gè)浮點(diǎn)型表示的value價(jià)格;
}s1,s2
3;直接定義結(jié)構(gòu)體類型變量,就是第二種中省略結(jié)構(gòu)體名的情況;
這種方式不能指明結(jié)構(gòu)體類型名而是直接定義結(jié)構(gòu)體變量,并且在值定義一次結(jié)構(gòu)體變量時(shí)適用,無結(jié)構(gòu)體名的結(jié)構(gòu)體類型是無法重復(fù)使用的。
也就是說,后面程序不能再定義此類型變量了,除非再寫一次重復(fù)的struct。
4、對(duì)于結(jié)構(gòu)體變量的初始化
4.1;先回憶一下關(guān)于基本數(shù)據(jù)類型和數(shù)組類型的初始化;
int a = 0;
int array[4] = {1,2,3,4};//每個(gè)元素用逗號(hào)隔開
回憶一下數(shù)組初始化問題;
再回到結(jié)構(gòu)體變量的初始化吧?
關(guān)于結(jié)構(gòu)體變量的初始化與初始化數(shù)組類似;
也是使用花括號(hào)括起來,用逗號(hào)分隔的初始化好項(xiàng)目列表,注意每個(gè)初始化項(xiàng)目必須要和要初始化的結(jié)構(gòu)體成員類型相匹配。
struct book s1={//對(duì)結(jié)構(gòu)體初始化
"yuwen",//title為字符串
"guojiajiaoyun",//author為字符數(shù)組
22.5 //value為flaot型
};
//要對(duì)應(yīng)起來,用逗號(hào)分隔開來,與數(shù)組初始化一樣;
4.2;加入一點(diǎn)小知識(shí);
關(guān)于結(jié)構(gòu)體初始化和存儲(chǔ)類時(shí)期的問題;
如果要初始化一個(gè)具有靜態(tài)存儲(chǔ)時(shí)期的結(jié)構(gòu)體,初始化項(xiàng)目列表中的值必須是常量表達(dá)式;
4.3;注意如果在定義結(jié)構(gòu)體變量的時(shí)候沒有初始化,那么后面就不能全部一起初始化了;
意思就是;
/////////這樣是可以的,在定義變量的時(shí)候就初始化了;
struct book s1={//對(duì)結(jié)構(gòu)體初始化
"guojiajiaoyun",//author為字符數(shù)組
"yuwen",//title為字符串
22.5
};
/////////這種就不行了,在定義變量之后,若再要對(duì)變量的成員賦值,那么只能單個(gè)賦值了;
struct book s1;
s1={
"guojiajiaoyun",//author為字符數(shù)組
"yuwen",//title為字符串
22.5
};//這樣就是不行的,只能在定義的時(shí)候初始化才能全部賦值,之后就不能再全體賦值了,只能單個(gè)賦值;
只能;
s1.title = "yuwen";........//單個(gè)賦值;
4.4;對(duì)于結(jié)構(gòu)體的指定初始化;
5、訪問結(jié)構(gòu)體成員
5.1;結(jié)構(gòu)體就像一個(gè)超級(jí)數(shù)組,在這個(gè)超級(jí)數(shù)組內(nèi),一個(gè)元素可以是char類型,下個(gè)元素就可以是flaot類型,再下個(gè)還可以是int數(shù)組型,這些都是存在的。
在數(shù)組里面我們通過下標(biāo)可以訪問一個(gè)數(shù)組的各個(gè)元素,那么如何訪問結(jié)構(gòu)體中的各個(gè)成員呢?
用結(jié)構(gòu)成員運(yùn)算符點(diǎn)(.)就可以了;
結(jié)構(gòu)體變量名.成員名;
注意,點(diǎn)其結(jié)合性是自左至右的,它在所有的運(yùn)算符中優(yōu)先級(jí)是最高的;
例如,s1.title指的就是s1的title部分,s1.author指的就是s1的author部分,s1.value指的就是s1的value部分。
然后就可以像字符數(shù)組那樣使用s1.title,像使用float數(shù)據(jù)類型一樣使用s1.value;
注意,s1;雖然是個(gè)結(jié)構(gòu)體,但是s1.value卻是float型的。
因此s1.value就相當(dāng)于float類型的變量名一樣,按照float類型來使用;
例如;printf(“%s\n%s\n%f”,s1.title,s1.author,s1.value);//訪問結(jié)構(gòu)體變量元素
注意scanf(“%d”,&s1.value); 這語句存在兩個(gè)運(yùn)算符,&和結(jié)構(gòu)成員運(yùn)算符點(diǎn)。
按照道理我們應(yīng)該將(s1。value括起來,因?yàn)樗麄兪钦w,表示s1的value部分)但是我們不括起來也是一樣的,因?yàn)辄c(diǎn)的優(yōu)先級(jí)要高于&。
5.2;如果其成員本身又是一種結(jié)構(gòu)體類型,那么可以通過若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)的找到最低一級(jí)成員再對(duì)其進(jìn)行操作;
結(jié)構(gòu)體變量名.成員.子成員………最低一級(jí)子成員;
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;可以將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體賦值給另一相同類型的結(jié)構(gòu)體變量,可以到達(dá)整體賦值的效果;這個(gè)成員變量的值都將全部整體賦值給另外一個(gè)變量;
5.3.2;不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出;在輸入輸出結(jié)構(gòu)體數(shù)據(jù)時(shí),必須分別指明結(jié)構(gòu)體變量的各成員;
-
總結(jié);除開“相同類型的結(jié)構(gòu)體變量可以相互整體賦值”外,其他情況下,不能整體引用,只能對(duì)各個(gè)成員分別引用。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
相關(guān)推薦
線路板工藝流程介紹
【功能擴(kuò)展】ASURO智能車玩“警察抓小偷”游戲
【CyberSmart】2009年第四屆智能車競(jìng)賽創(chuàng)意組預(yù)賽
油箱注油液位自動(dòng)控制伴蛙鳴發(fā)聲電路
請(qǐng)高手指路
【長(zhǎng)春大學(xué)】飛思卡爾智能車
請(qǐng)問S3C4510的JTAG部分的用74LS126行不行?
(2024.11.18)半導(dǎo)體一周要聞
[討論]任務(wù)堆棧和系統(tǒng)堆棧
ADALM2000實(shí)驗(yàn):變壓器耦合放大器
基本半導(dǎo)體完成股份改制,正式更名
深井水位探測(cè)聲光報(bào)叫電路
得益于出口增長(zhǎng),起亞2024年在中國(guó)的銷量有所改善
使用iPhone控制智能車
TMS320LF240x DSP應(yīng)用程序設(shè)計(jì)教程
貿(mào)澤開售適用于汽車、音頻、視頻和遙測(cè)應(yīng)用的TI DP83TG721-Q1 1000Base-T1以太網(wǎng)物理層收發(fā)器
中南民族大學(xué)第三屆飛思卡爾智能車競(jìng)賽預(yù)賽(第一名)
壓電式高料位自動(dòng)控制及報(bào)叫電路
難道tornado2.2做的BSP再也不能用vxload.com在DOS/WIN98下load起來了嗎?
發(fā)送機(jī)基本結(jié)構(gòu)
恩智浦FXLS8971CF和FXLS8961AF加速度傳感器提升您的精密測(cè)斜儀應(yīng)用性能
Waveguide Filters_Cross-Couplings
創(chuàng)新不止 美芝、威靈亮相2024中國(guó)家用電器技術(shù)大會(huì)
英飛凌攜手Stellantis,推動(dòng)下一代汽車架構(gòu)的功率轉(zhuǎn)換和分配創(chuàng)新
高料位大功率自動(dòng)控制電路
10月份巴西汽車銷售創(chuàng)下自2014年12月以來最佳表現(xiàn)
百套嵌入式資料及軟件系統(tǒng)
多普勒效應(yīng)和光照雙控自動(dòng)門插座電路(RD627)
零中頻射頻接收機(jī)技術(shù)
普華基礎(chǔ)軟件與瑞薩達(dá)成合作伙伴關(guān)系,推進(jìn)汽車底層技術(shù)革新