1.關(guān)于c語(yǔ)言結(jié)構(gòu)體的引入
在前面已經(jīng)介紹了整形(int粹湃,long,….)泉坐,浮點(diǎn)型(flaot为鳄,double),字符型(char)腕让,還介紹了數(shù)組(存儲(chǔ)一組具有相同類(lèi)型的數(shù)據(jù))济赎,字符串。但是在實(shí)際問(wèn)題中只有這些數(shù)據(jù)類(lèi)型是不夠的记某,有時(shí)候我們需要其中的幾種一起來(lái)修飾某個(gè)變量司训,例如一個(gè)學(xué)生的信息就需要學(xué)號(hào)(字符串),姓名(字符串)液南,年齡(整形)等等壳猜,這些數(shù)據(jù)類(lèi)型都不同但是他們又是表示一個(gè)整體,要存在聯(lián)系滑凉,那么我們就需要一個(gè)新的數(shù)據(jù)類(lèi)型统扳。
——結(jié)構(gòu)體:就將不同類(lèi)型的數(shù)據(jù)存放在一起,作為一個(gè)整體進(jìn)行處理畅姊。
2.c語(yǔ)言使用結(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)于一條語(yǔ)句粗合;
這個(gè)聲明描述了一個(gè)由兩個(gè)字符數(shù)組和一個(gè)float變量組成的結(jié)構(gòu)體萍嬉,但是注意,他并沒(méi)有創(chuàng)建一個(gè)實(shí)際的數(shù)據(jù)對(duì)象隙疚,而是描述了一個(gè)組成這類(lèi)對(duì)象的元素壤追,【因此,我們也有時(shí)候?qū)⒔Y(jié)構(gòu)體聲明叫做模板供屉,因?yàn)樗蠢粘鰯?shù)據(jù)該如何存儲(chǔ)行冰,并沒(méi)有實(shí)例化數(shù)據(jù)對(duì)象】。
下面介紹一下上面的結(jié)構(gòu)體聲明伶丐;
1.首先使用關(guān)鍵字struct悼做,他表示接下來(lái)是一個(gè)結(jié)構(gòu)體。
2.后面是一個(gè)可選的標(biāo)志(book)撵割,它是用來(lái)引用該結(jié)構(gòu)體的快速標(biāo)記贿堰。因此我們以后就會(huì)可以這樣創(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.接下來(lái)就是一個(gè)花括號(hào)羹与,括起了結(jié)構(gòu)體成員列表,及就是每個(gè)成員變量庶灿,使用的都是其自己的聲明方式來(lái)描述纵搁,用分號(hào)來(lái)結(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)于我們不斷說(shuō)的娘锁,標(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ì)是一次性的杯道,
還有就是引入typedef匪煌。
這個(gè)到后面的定義結(jié)構(gòu)體變量一起說(shuō)吧
關(guān)于結(jié)構(gòu)體類(lèi)型的定義的總結(jié),一般格式就是:
struct 結(jié)構(gòu)體名(也就是可選標(biāo)記名)
{
成員變量;
}党巾;//使用分號(hào)表示定義結(jié)束萎庭;
小編給大家推薦一個(gè)學(xué)習(xí)氛圍超好的地方,C/C++交流企鵝裙:870963251齿拂!適合在校大學(xué)生驳规,小白,想轉(zhuǎn)行署海,想通過(guò)這個(gè)找工作的加入吗购。裙里有大量學(xué)習(xí)資料医男,有大神解答交流問(wèn)題,每晚都有免費(fèi)的直播課程
3.定義結(jié)構(gòu)體變量
3.1之前我們結(jié)構(gòu)體類(lèi)型的定義(結(jié)構(gòu)體的聲明)只是告訴編譯器該如何表示數(shù)據(jù)捻勉,但是它沒(méi)有讓計(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é)合在一起的琐凭,這也是后面訪(fǎng)問(wèn)結(jié)構(gòu)體變量成員的時(shí)候,我們就要用到結(jié)構(gòu)體變量名來(lái)訪(fǎng)問(wèn)浊服。
分析:
struct book的作用统屈;在結(jié)構(gòu)體聲明中,struct book所起到的作用就像int牙躺,愁憔,,孽拷,等基礎(chǔ)數(shù)據(jù)類(lèi)型名作用一樣吨掌。
struct book s1,s2脓恕,*ss膜宋;
定義兩個(gè)struct book結(jié)構(gòu)體類(lèi)型的結(jié)構(gòu)體變量,還定義了一個(gè)指向該結(jié)構(gòu)體的指針炼幔,其ss指針可以指向s1秋茫,s2,或者任何其他的book結(jié)構(gòu)體變量乃秀。
其實(shí):
struct book library肛著;
等效于:
struct book{
char …
….
…..
}librar;
這兩種是等效的跺讯,只是第一種可以減少代碼的編寫(xiě)量枢贿;
3.2現(xiàn)在還是回到剛才提及的那個(gè)問(wèn)題,可選標(biāo)志符什么時(shí)候可以省略
其一:
struct
{
char title[MAXTITL];
char author[MAXAUTL];
float value刀脏;
}library;
//注意:這里不再是定義聲明結(jié)構(gòu)體類(lèi)型局荚,而是直接創(chuàng)建結(jié)構(gòu)體變量了,這個(gè)編譯器會(huì)分配內(nèi)存的;
//這樣的確可以省略標(biāo)識(shí)符也就是結(jié)構(gòu)體名耀态,但是只能使用一次轮傍,因?yàn)檫@是聲明結(jié)構(gòu)體的過(guò)程和定義結(jié)構(gòu)體變量的過(guò)程和在了一起,并且個(gè)成員變量沒(méi)有初始化的茫陆;
//如果你想多次使用一個(gè)結(jié)構(gòu)體模塊,這樣子是行不通的擎析;
其二:
用typedef定義新類(lèi)型名來(lái)代替已有類(lèi)型名簿盅,即給已有類(lèi)型重新命名;
一般格式為揍魂;typedef 已有類(lèi)型 新類(lèi)型名桨醋;
typedef int Elem;
typedef struct{
int date;
.....
.....
}STUDENT;
STUDENT stu1,stu2;
總結(jié)一下關(guān)于結(jié)構(gòu)體變量的定義:
1.先定義結(jié)構(gòu)體類(lèi)型后再定義結(jié)構(gòu)體變量;
格式為现斋;struct 結(jié)構(gòu)體名 變量名列表喜最;
struct book s1,s2庄蹋,*ss瞬内;//注意這種之前要先定義結(jié)構(gòu)體類(lèi)型后再定義變量;
2.在定義結(jié)構(gòu)體類(lèi)型的同時(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)體類(lèi)型變量,就是第二種中省略結(jié)構(gòu)體名的情況劝枣;
這種方式不能指明結(jié)構(gòu)體類(lèi)型名而是直接定義結(jié)構(gòu)體變量踱承,并且在值定義一次結(jié)構(gòu)體變量時(shí)適用,無(wú)結(jié)構(gòu)體名的結(jié)構(gòu)體類(lèi)型是無(wú)法重復(fù)使用的哨免,也就是說(shuō)茎活,后面程序不能再定義此類(lèi)型變量了,除非再寫(xiě)一次重復(fù)的struct
4.對(duì)于結(jié)構(gòu)體變量的初始化
4.1先回憶一下關(guān)于基本數(shù)據(jù)類(lèi)型和數(shù)組類(lèi)型的初始化
int a = 0琢唾;
int array[4] = {1,2,3,4};//每個(gè)元素用逗號(hào)隔開(kāi)
回憶一下數(shù)組初始化問(wèn)題载荔;
再回到結(jié)構(gòu)體變量的初始化吧
關(guān)于結(jié)構(gòu)體變量的初始化與初始化數(shù)組類(lèi)似:也是使用花括號(hào)括起來(lái),用逗號(hào)分隔的初始化好項(xiàng)目列表采桃,注意每個(gè)初始化項(xiàng)目必須要和要初始化的結(jié)構(gòu)體成員類(lèi)型想匹配
struct book s1={//對(duì)結(jié)構(gòu)體初始化
"yuwen",//title為字符串
"guojiajiaoyun",//author為字符數(shù)組
22.5 //value為flaot型
};
//要對(duì)應(yīng)起來(lái)懒熙,用逗號(hào)分隔開(kāi)來(lái)丘损,與數(shù)組初始化一樣;
4.2加入一點(diǎn)小知識(shí)工扎,關(guān)于結(jié)構(gòu)體初始化和存儲(chǔ)類(lèi)時(shí)期的問(wèn)題
如果要初始化一個(gè)具有靜態(tài)存儲(chǔ)時(shí)期的結(jié)構(gòu)體徘钥,初始化項(xiàng)目列表中的值必須是常量表達(dá)式,
如果存儲(chǔ)時(shí)期是自動(dòng)的肢娘,那么列表的值就不必是常量了呈础;
關(guān)于這點(diǎn)在講存儲(chǔ)類(lèi)時(shí)期的時(shí)候在分析;
4.3注意:
如果在定義結(jié)構(gòu)體變量的時(shí)候沒(méi)有初始化橱健,那么后面就不能全部一起初始化了而钞;
意思就是:
/////////這樣是可以的,在定義變量的時(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)體的指定初始化
《這個(gè)只存在于c99,》
5.訪(fǎng)問(wèn)結(jié)構(gòu)體成員
5.1結(jié)構(gòu)體就像一個(gè)超級(jí)數(shù)組促王,在這個(gè)超級(jí)數(shù)組內(nèi)犀盟,一個(gè)元素可以是char類(lèi)型,下個(gè)元素就可以是flaot類(lèi)型蝇狼,再下個(gè)還可以是int數(shù)組型阅畴,這些都是存在的。在數(shù)組里面我們通過(guò)下標(biāo)可以訪(fǎng)問(wèn)一個(gè)數(shù)組的各個(gè)元素迅耘,那么如何訪(fǎng)問(wèn)結(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ù)類(lèi)型一樣使用s1.value;
注意:s1;雖然是個(gè)結(jié)構(gòu)體只壳,但是s1.value卻是float型的俏拱,因此s1.value就相當(dāng)于float類(lèi)型的變量名一樣,按照f(shuō)loat類(lèi)型來(lái)使用吼句;
例如锅必;printf(“%s %s %f”,s1.title,s1.author,s1.value);//訪(fǎng)問(wèn)結(jié)構(gòu)體變量元素
注意:scanf(“%d”,&s1.value); 這語(yǔ)句存在兩個(gè)運(yùn)算符,&和結(jié)構(gòu)成員運(yùn)算符點(diǎn)惕艳,按照道理我們應(yīng)該將(s1搞隐。value括起來(lái),因?yàn)樗麄兪钦w尔艇,表示s1的value部分)但是我們不括起來(lái)也是一樣的尔许,因?yàn)辄c(diǎn)的優(yōu)先級(jí)要高于&么鹤。
5.2如果其成員本身又是一種結(jié)構(gòu)體類(lèi)型终娃,那么可以通過(guò)若干個(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整體與分開(kāi)
5.3.1可以將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體賦值給另一相同類(lèi)型的結(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é):除開(kāi)“相同類(lèi)型的結(jié)構(gòu)體變量可以相互整體賦值”外钥组,其他情況下输硝,不能整體引用,只能對(duì)各個(gè)成員分別引用程梦;
6.結(jié)構(gòu)體數(shù)組(這個(gè)在國(guó)二里面车惆眩考的類(lèi)型,只要考結(jié)構(gòu)體就離不開(kāi)結(jié)構(gòu)體數(shù)組和成員的訪(fǎng)問(wèn)屿附,當(dāng)然也只是簡(jiǎn)單的操作)
6.1為什么要引用結(jié)構(gòu)體數(shù)組?
顯然郎逃,在上面的book類(lèi)型的結(jié)構(gòu)體 ,每本書(shū)就需要用一個(gè)book類(lèi)型的結(jié)構(gòu)體變量來(lái)描述挺份,若是要描述兩本書(shū)衣厘,需要使用兩個(gè)這樣的變量,依次類(lèi)推;因此要使用一個(gè)該結(jié)構(gòu)體的數(shù)組影暴,來(lái)表示這些圖書(shū)错邦;并且數(shù)組就是存儲(chǔ)一組具有相同類(lèi)型的數(shù)據(jù),因此就有了結(jié)構(gòu)體數(shù)組的出現(xiàn)型宙,注意本置撬呢,
6.2聲明結(jié)構(gòu)體數(shù)組
與普通的數(shù)組聲明一樣,int a[10];int為元素的數(shù)據(jù)類(lèi)型妆兑,a為數(shù)組名 【10】表示申請(qǐng)了10的int單元的內(nèi)存魂拦;
再看結(jié)構(gòu)體聲明;struct book library[10];是不是類(lèi)似搁嗓,struct book為數(shù)組元素的數(shù)據(jù)類(lèi)型芯勘,library為數(shù)組名,[10]為申請(qǐng)了10個(gè)struct book單元的內(nèi)存腺逛;
解釋?zhuān)宦暶鱨ibrary為一個(gè)具體10個(gè)元素的數(shù)組荷愕,并且每個(gè)元素都book類(lèi)型的結(jié)構(gòu),因此可以得到library[0],library[1]…….都是單獨(dú)獨(dú)立的一個(gè)book結(jié)構(gòu)棍矛;
注意library本身不是結(jié)構(gòu)體名而是一個(gè)數(shù)組名安疗;
6.3結(jié)構(gòu)體數(shù)組的初始化
兩種初始化:就是在定義的時(shí)候賦值的兩種情況;
6.4訪(fǎng)問(wèn)結(jié)構(gòu)體數(shù)組的成員
規(guī)則:在結(jié)構(gòu)體名后加點(diǎn)運(yùn)算符够委,然后再是成員名荐类;
library[5].title;//表示第5個(gè)元素的title成員;library[5]是結(jié)構(gòu)體變量名茁帽,title就是成員名玉罐;
library[5].titlt[4];//注意title是數(shù)組類(lèi)型,第5個(gè)數(shù)組元素的title成員的第4個(gè)字符潘拨;
總結(jié):
library //book結(jié)構(gòu)體的數(shù)組
library[2]//數(shù)組的第二個(gè)元素吊输,一個(gè)book結(jié)構(gòu)體類(lèi)型的變量名;
library[2].title战秋;//char數(shù)組璧亚,結(jié)構(gòu)體數(shù)組的第二個(gè)元素的title成員;
library[2].title[4];//表示一個(gè)字符,結(jié)構(gòu)體數(shù)組的第二個(gè)元素的title成員的第四個(gè)字符桂肌;
7.指向結(jié)構(gòu)體的指針
7.1使用指向結(jié)構(gòu)體的好處;就像指向數(shù)組的指針一樣疯搅,它比數(shù)組本身更容易操作,指向結(jié)構(gòu)體的指針通常也比結(jié)構(gòu)體本身更容易操作埋泵;
聲明和初始化結(jié)構(gòu)體指針幔欧,
聲明struct book * him罪治;
規(guī)則就是,struct 結(jié)構(gòu)體名+ * + 指針名礁蔗;
這個(gè)聲明不是建立一個(gè)新的結(jié)構(gòu)體觉义,而是創(chuàng)建了一個(gè)指針類(lèi)型的him指針變量,他可以指向任何現(xiàn)有的book類(lèi)型的結(jié)構(gòu)體浴井;
him = &library[0]晒骇;
指針him正指向結(jié)構(gòu)體library[0],如何使用him來(lái)取得library[0]的一個(gè)成員呢磺浙?
方法一:
引入一個(gè)運(yùn)算符洪囤,->
后跟->運(yùn)算符的結(jié)構(gòu)體指針和后跟.點(diǎn)運(yùn)算符的結(jié)構(gòu)體名是一樣操作的;
注意一點(diǎn)的是撕氧;不能使用him.成語(yǔ)瘤缩;因?yàn)閔im不是結(jié)構(gòu)體名;
總結(jié):
->只用于結(jié)構(gòu)體指針訪(fǎng)問(wèn)成員伦泥;
.點(diǎn)只用于結(jié)構(gòu)體名訪(fǎng)問(wèn)成員剥啤;
方法二:
如果him=&library[0],那么him=library[0]奄喂;因?yàn)?amp;和是一個(gè)互逆的運(yùn)算符铐殃;
&取地址海洼,*取值跨新;
=》library[0].value 等價(jià)于 (*him).value;注意必須使用圓括號(hào)坏逢,優(yōu)先級(jí)問(wèn)題域帐;
然后都與him.value是一個(gè)作用;
對(duì)于考國(guó)二懂得上面的也就差不多了,足夠了是整;
8.向函數(shù)傳遞結(jié)構(gòu)體信息
8.1傳遞結(jié)構(gòu)體成員
只要結(jié)構(gòu)體成員是具有單值的數(shù)據(jù)類(lèi)型肖揣,(及int等基礎(chǔ)數(shù)據(jù)類(lèi)型)就可以把它作為參數(shù)傳遞給一個(gè)接受這個(gè)特定參數(shù)類(lèi)型的函數(shù);
注意:這個(gè)只能實(shí)現(xiàn)訪(fǎng)問(wèn)浮入,不能修改龙优;
8.2使用結(jié)構(gòu)體地址
注意:如果不修改值,則設(shè)置為const
8.3使用結(jié)構(gòu)體作為參數(shù)傳遞
其中s也是結(jié)構(gòu)體變量事秀,并且為s1結(jié)構(gòu)體變量的副本彤断。
總結(jié):
結(jié)構(gòu)體指針,使用->運(yùn)算符訪(fǎng)問(wèn)成員易迹;
結(jié)構(gòu)體名宰衙;使用.點(diǎn)運(yùn)算符訪(fǎng)問(wèn)成員;
要想通過(guò)調(diào)用函數(shù)修改實(shí)參結(jié)構(gòu)體變量的值睹欲,只能傳遞地址供炼,通過(guò)指針來(lái)修改一屋;直在地址上修改;
8.4結(jié)構(gòu)體之間的雙向通信
先注意這個(gè):c語(yǔ)言中對(duì)于結(jié)構(gòu)體變量是可以整體賦值的袋哼,無(wú)論其成員是怎樣的
傳遞地址冀墨,使用結(jié)構(gòu)體指針接收,用于訪(fǎng)問(wèn)不做修改涛贯;const限制修改轧苫,
結(jié)構(gòu)體作為參數(shù)傳遞,不能成功修改實(shí)參,只能訪(fǎng)問(wèn)疫蔓;
結(jié)構(gòu)體作為參數(shù)含懊,修改結(jié)構(gòu)體并且返回類(lèi)型也為結(jié)構(gòu)體達(dá)到修改的目的;
傳遞地址衅胀,使用結(jié)構(gòu)體指針接收岔乔,用于修改,不使用const限制修改
通常我們是使用結(jié)構(gòu)體指針的滚躯,如果不修改那么我們會(huì)使用const修改雏门;
9.在結(jié)構(gòu)體中使用字符數(shù)組還是字符指針來(lái)存儲(chǔ)字符串
答案先給出:盡量使用字符數(shù)組;
9.1使用字符數(shù)組
#define MAXTITL 100
#define MAXAUTL 100
struct book
{
char title[MAXTITL];//一個(gè)字符串表示的titile 題目 掸掏;
char author[MAXAUTL];//一個(gè)字符串表示的author作者 茁影;
float value;//一個(gè)浮點(diǎn)型表示的value價(jià)格;
};
字符串的存儲(chǔ)在結(jié)構(gòu)體內(nèi)部的丧凤;
結(jié)構(gòu)體總分配200個(gè)字節(jié)的內(nèi)存給這兩個(gè)字符串
9.2使用字符指針
struct book
{
char *title募闲;
char * author;
};
這里的字符串是存儲(chǔ)在編譯器認(rèn)為存儲(chǔ)字符串常量的任何地方愿待,這個(gè)結(jié)構(gòu)體中存放的只有兩個(gè)地址而已浩螺,值分配8分字節(jié);結(jié)構(gòu)體不為字符串分配任何內(nèi)存存儲(chǔ)空間仍侥,因此這時(shí)候在輸入的時(shí)候存在了一個(gè)潛在的危險(xiǎn)要出;
scanf("%s",s.last);//把字符串放到由s.last指向的內(nèi)存中因?yàn)檫@是一個(gè)未初始化的變量,因此該地址是可以指向任意大小的农渊,因此此時(shí)就是一個(gè)潛在的危險(xiǎn)患蹂;
總結(jié):因我們最好是使用字符數(shù)組來(lái)存儲(chǔ)字符串;