三丶結(jié)構(gòu)體
構(gòu)造體相當(dāng)于用戶自己定義一種數(shù)據(jù)結(jié)構(gòu)里面可以存放各種不同的數(shù)據(jù)類型
?? structDate
??? {
?????? intday;
?????? intmouth;
?????? intyear;
??? };
??? struct Student
??? {
?????? intnum;
?????? charname[20];
?????? charsex;
?????? intage;
?????? struct? Date birthday;
?????? charaddr[30];
??? }student1,student2;?? ---注意變量名的定義
代碼中的? Date相當(dāng)于結(jié)構(gòu)體的類型名 而birthday則為結(jié)構(gòu)體的變量名
注意:
[if !supportLists]1.?[endif]結(jié)構(gòu)體的類型名和結(jié)構(gòu)體的變量名是不同的概念号阿,只能對(duì)變量賦值,存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算椰苟。并且在編譯時(shí)對(duì)類型是不會(huì)分配空間的
[if !supportLists]2.?[endif]結(jié)構(gòu)體中成員的變量名可以與程序中的變量名相同洪规,不過(guò)兩個(gè)指的是不同的對(duì)象,并且互不干擾
[if !supportLists]3.?[endif]結(jié)構(gòu)體中的成員也能夠單獨(dú)使用
??? struct Student
??? {
?????? intnum;
?????? charname[20];
?????? charsex[10];
?????? intage;
?????? charaddr[30];
??? }student3= {97001,"吳宣儀","女",23,"海南"};
??? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s", student3.num,student3.name, student3.sex, student3.age, student3.addr);
注意其使用
順便提一下C語(yǔ)言中 scanf中如果要求輸入數(shù)組的話 可以不用加取址符雨膨!因?yàn)閿?shù)組本身就有地址
同時(shí)還有結(jié)構(gòu)體數(shù)組的使用
結(jié)構(gòu)體指針 (主要代碼如下)
???????? struct Student
???????? {
????????????????? intnum;
????????????????? charname[20];
????????????????? charsex[10];
????????????????? intage;
????????????????? charaddr[30];
???????? }student3 ={97001,"吳宣儀","女",23,"海南"};
???????? struct Student*p,*p2,*p3;
???????? struct Student student[3] = { { 97001, "吳宣儀", "女", 23, "海南" }, { 97001, "趙麗穎", "女", 27, "河北" }, { 97001, "張藝興", "男", 25, "長(zhǎng)沙"} };
???????? p =&student3;
???????? p2 =&student[2];
???????? p3 =&student[1];
???????? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s\n\n", student3.num,student3.name, student3.sex, student3.age, student3.addr);
???????? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s\n\n", (*p).num, (*p).name,(*p).sex, (*p).age, (*p).addr);
???????? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s\n\n", (*p2).num,(*p2).name, (*p2).sex, (*p2).age, (*p2).addr);
???????? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s\n\n", p3->num,p3->name, p3->sex, p3->age, p3->addr);
1.注意點(diǎn)? 當(dāng)用指針指向結(jié)構(gòu)體成員的時(shí)候? 如(*p2).num? 括號(hào)不可省略 因?yàn)?的優(yōu)先級(jí)比*高
否則就會(huì)變成*(p2.num)會(huì)出錯(cuò)的
2.?structStudent*p1;
???????? p1 = (structStudent*)&student[0].num;? 注意指向如果想去指向結(jié)構(gòu)體中的成員地址的話松蒜,則 必須要使用強(qiáng)制轉(zhuǎn)換
指向結(jié)構(gòu)體數(shù)組的指針
???????? struct Student
???????? {
????????????????? intnum;
????????????????? charname[20];
????????????????? charsex[10];
????????????????? intage;
????????????????? charaddr[30];
???????? };
???????? struct Student*p;
???????? struct Student student[3] = { { 97001, "吳宣儀", "女", 23, "海南" }, { 97001, "趙麗穎", "女", 27, "河北" }, { 97001, "張藝興", "男", 25, "長(zhǎng)沙"} };
???????? for(p =student; p < student + 3; p++)
???????? {
????????????????? printf("學(xué)號(hào):%d\n姓名:%s\n性別:%s\n年齡:%d\n地址:%s\n\n", p->num,p->name, p->sex, p->age, p->addr);
???????? }
仔細(xì)觀察這個(gè)for循環(huán)中的p的作用 指向地址并且一直在自加一 十分巧妙的方法
3.用結(jié)構(gòu)體變量或者結(jié)構(gòu)體變量成員去作為函數(shù)參數(shù)時(shí) 為值傳遞(其運(yùn)行的函數(shù)不會(huì)改變其原來(lái)的值扔茅,只會(huì)產(chǎn)生一種新的影響)
結(jié)構(gòu)體指針變量 則為址傳遞