《c语言从入门到精通》看书笔记——第11章 结构体和共用体
生活随笔
收集整理的這篇文章主要介紹了
《c语言从入门到精通》看书笔记——第11章 结构体和共用体
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、結(jié)構(gòu)體:
“結(jié)構(gòu)體”是一種構(gòu)造類型,它是由若干“成員”組成的,其中的每一個成員可以是一個基本數(shù)據(jù)類型或者有事一個構(gòu)造類型。
(1)聲明結(jié)構(gòu)體時使用的關(guān)鍵字是struct,其一般形式為:
struct 結(jié)構(gòu)體名
?????{
? ? ? ? ? 成員列表
?????};
注意:在聲明結(jié)構(gòu)體時,要注意大括號最后面有一個分號“;”,在編程時不要忘記。
例如:聲明一個結(jié)構(gòu)體Product
struct Product
{
char cName[10]; ? ? //產(chǎn)品名稱
char cShape[20]; ? ? //形狀
int iPrice; ? ? ?//價格
char cArea[20]; ? ? //產(chǎn)地?
};
上面聲明的結(jié)構(gòu)體類型product,在結(jié)構(gòu)體中定義的變量是結(jié)構(gòu)體Product的成員,這些變量可以根據(jù)結(jié)構(gòu)體成員中不同的作用選擇與其相對應(yīng)的類型。
(2)結(jié)構(gòu)體變量的定義
聲明一個結(jié)構(gòu)體表示的創(chuàng)建一種新的類型名,要用新的類型名再定義變量。定義有三種方法:
1)聲明結(jié)構(gòu)體類型,再定義變量。
例如:sTruct Product product1;
技巧:為了使規(guī)模較大的程序更便于修改和使用,常常將結(jié)構(gòu)體類型的聲明放在一個頭文件中,這樣在其他源文件中如果需要使用該結(jié)構(gòu)體類型則可以用#include命令將該頭文件包含到源頭文件中。
2)在聲明結(jié)構(gòu)體類型時,同時定義變量。
一般形式為:
struct 結(jié)構(gòu)體名
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? 成員列表;
? ? ? ? ? ?????}變量名列表;
可以看到,在一般形式中將定義的變量的名稱放在聲明結(jié)構(gòu)體的末尾處。
3)直接定義結(jié)構(gòu)體類型變量。
一般形式為:
?struct
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? 成員列表
? ? ? ? ? ?????}變量名列表;
2、結(jié)構(gòu)體變量的引用
結(jié)構(gòu)體變量的引用不能直接將一個結(jié)構(gòu)體變量作為一個整體進行輸入和輸出。
要對結(jié)構(gòu)體變量進行賦值、存取和運算、實質(zhì)上就是對結(jié)構(gòu)體成員的操作。結(jié)構(gòu)體變量成員的一般形式為:
結(jié)構(gòu)體變量名.成員名
? ? ?在引用結(jié)構(gòu)體成員時,可以在結(jié)構(gòu)的變量名的后面加上成員運算符“.”和成員的名字。例如:
product1.cName="lcebox";
注意:但是如果成員本身又屬于一個結(jié)構(gòu)體類型,這時就要使用若干個成員運算符,一級一級地找到最低一級的成員。只能對最低級的成員進行賦值或存取以及運算操作。
3、結(jié)構(gòu)體類型的初始化
例如:
struct Student
{
char cName[20];
char cSex;
int iGrade;
} student1={"HanXue","W",3}; ? ? //定義變量并設(shè)置初始值
在初始化時要注意,定義的變量后面使用等號,然后將其初始化的值放在大括號中,并且每一個數(shù)據(jù)要與結(jié)構(gòu)體的成員列表的順序一樣。
4、定義結(jié)構(gòu)體數(shù)組(是整個結(jié)構(gòu)體內(nèi)的內(nèi)容都定義為一個整體)
定義一個結(jié)構(gòu)體數(shù)組的方式與定義結(jié)構(gòu)體變量的方法相同,只是結(jié)構(gòu)體變量替換成數(shù)組。定義結(jié)構(gòu)體數(shù)組的一般形式如下:
?struct 結(jié)構(gòu)體名
? ? ?{
? ? ? ? ? 成員列表;
?????}數(shù)組名;
這種定義結(jié)構(gòu)體數(shù)組的方式是聲明結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體數(shù)組,可以看到結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體變量的位置是相同的。
就像定義結(jié)構(gòu)體變量那樣,定義結(jié)構(gòu)體數(shù)組也可以有不同的方式。例如,先聲明結(jié)構(gòu)體類型再定義結(jié)構(gòu)體數(shù)組:
struct Student student[5]; ? ? //定義結(jié)構(gòu)體數(shù)組
5、初始化結(jié)構(gòu)體數(shù)組
一般形式為:
?struct 結(jié)構(gòu)體名
?????{
? ? ? ? ? 成員列表;
?????}數(shù)組名={初始值列表};
在定義數(shù)組student時,也可以不指定數(shù)組中的元素個數(shù),這時編譯器會根據(jù)數(shù)組后面的初始化值列表中給出的元素個數(shù),來確定數(shù)組中元素的個數(shù)。例如:
student[]={...};
6、結(jié)構(gòu)體指針:一個指向變量的指針表示的變量所占內(nèi)存中的起始地址。如果一個指針指向結(jié)構(gòu)體變量,那么該指針指向的結(jié)構(gòu)體變量的起始地址。同樣指針變量也可以指向結(jié)構(gòu)體數(shù)組的元素。
7、指向結(jié)構(gòu)體變量的指針
既然指針指向結(jié)構(gòu)體變量的地址,因此可以使用指針來訪問結(jié)構(gòu)體的成員。定義結(jié)構(gòu)體指針的一般形式為:
? 結(jié)構(gòu)體類型 *指針名;
使用指向結(jié)構(gòu)體變量的指針訪問成員有兩種方法,pStruct為指向結(jié)構(gòu)體變量的指針。
第一種方法:使用點運算符引用結(jié)構(gòu)成員:
(*pStruct).成員名
結(jié)構(gòu)體變量可以使用點運算符對其中的成員進行引用。*pStruct表示指向的結(jié)構(gòu)體變量因此使用點運算符可以應(yīng)用結(jié)構(gòu)體中的成員變量。
*pStruct一定要使用括號,因為點運算符的優(yōu)先級是最高的,如果不使用括號,就會先執(zhí)行點運算然后是*運算。
第二種方法:使用指向運算符引用結(jié)構(gòu)成員:
pStruct ->成員名;
第三種方法:使用結(jié)構(gòu)體名點運算符引用結(jié)構(gòu)成員
student.成員名;
三種形式的效果是等價的,比如:
student.成員名 === (*pStruct).成員名 === pStruct->成員名
8、在使用“->”引用成員時,要注意分析一下情況:
(1)pStruct->iGrade,表示指向的結(jié)構(gòu)體變量中成員iGrade的值。
(2)pStruct->iGtade++,表示指向的結(jié)構(gòu)體變量中成員iGrade的值,使用后該值加1.
(3)++pStruct->iGrade,表示指向的結(jié)構(gòu)體變量中成員iGrade的值加1,計算后再進行使用。
9、指向結(jié)構(gòu)體數(shù)組的指針
結(jié)構(gòu)體指針變量指向結(jié)構(gòu)體數(shù)組時,指針變量的值就是結(jié)構(gòu)體數(shù)組的首地址。
結(jié)構(gòu)體指針變量也可以直接指向結(jié)構(gòu)體數(shù)組中的元素,這時指針變量的值就是該結(jié)構(gòu)體數(shù)組元素的首地址。例如定義一個結(jié)構(gòu)體數(shù)組student[5],使用結(jié)構(gòu)體指針指向該數(shù)組:
struct Student* pStruct;
pStruct=student;
因為數(shù)組不使用下標時表示的是屬豬的第一個元素的地址,所以指針指向數(shù)組的首地址。如果想利用指針指向第3個元素,則在數(shù)組名后附加下標,然后在數(shù)組名前使用取地址符號&,例如:
pStruct = &student[2];
10、結(jié)構(gòu)體變量做函數(shù)參數(shù)
(1)使用結(jié)構(gòu)體變量作為函數(shù)參數(shù)
使用結(jié)構(gòu)體變量作為函數(shù)的參數(shù)時,采取的是“值傳遞”,會將結(jié)構(gòu)體變量所占內(nèi)存單元的內(nèi)容全部順序傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量。例如:
void Display(struct Student stu);
在形參的位置使用結(jié)構(gòu)體變量,但是函數(shù)調(diào)用期間,形參也要占用內(nèi)存單元。這種傳遞方式在空間和時間上開銷都比較大。
另外,根據(jù)函數(shù)參數(shù)傳值方式,如果在函數(shù)內(nèi)部修改了變量中成員的值,則改變的值不會返回到主調(diào)函數(shù)中。
(2)使用指向結(jié)構(gòu)體變量的指針作為函數(shù)參數(shù)
在傳遞結(jié)構(gòu)體變量的指針時,只是將結(jié)構(gòu)體變量的首地址進行傳遞,并沒用將變量的副本進行傳遞。例如聲明一個傳遞結(jié)構(gòu)體變量指針的函數(shù)如下:
void Display(struct Student* stu)
這樣使用形參stu指針就可以引用結(jié)構(gòu)體變量中的成員了。
(3)使用結(jié)構(gòu)體變量的成員作為函數(shù)參數(shù)
使用這種方式為函數(shù)傳遞參數(shù)與普通的變量作為實參是一樣的,是傳值方式傳遞。例如:
Display(student.fScore[0]);
注意:傳值時,實參要與形參的類型一直。
11、數(shù)據(jù)是信息的載體,是描述客觀事物屬性的數(shù)、字符以及所有能輸入到計算機中并被計算機程序識別和處理的集合。數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)對象以及其中的相互關(guān)系和構(gòu)造方法。有關(guān)線性表的連式存儲結(jié)構(gòu)稱為鏈表。
12、鏈表:其存儲元素個數(shù)是不受限制的,當進行添元素時,存儲的個數(shù)就會隨之改變。
在鏈表中每個元素包含數(shù)據(jù)部分和指針部分。數(shù)據(jù)部分用來存放元素所包含的數(shù)據(jù),而指針部分用來指向下一個元素,最后一個指針指向NULL,表示指向的地址為空。
?注意:在鏈表這種數(shù)據(jù)結(jié)構(gòu)中,必須利用指針才能實現(xiàn),因此鏈表中的節(jié)點應(yīng)該包含一個指針變量來保存下一個節(jié)點的地址。
例如:設(shè)計一個鏈表表示一個班級,其中鏈表中的節(jié)點表示學生:
struct Student
{
char cName[20]; ? ? //姓名
int iNumber; ? ? ? ? ?//學號
struct Student* pNext ; ? ? //指向下一個節(jié)點的指針
}
當有新的節(jié)點要添加到鏈表中時,原來最后一個節(jié)點的指針將保存新添加的節(jié)點地址,而新節(jié)點的指針指向空(NULL),當添加完成后,新節(jié)點將成為鏈表的最后一個節(jié)點。
13、創(chuàng)建動態(tài)鏈表
鏈表的創(chuàng)建過程是一個動態(tài)的創(chuàng)建過程,動態(tài)創(chuàng)建一個節(jié)點時,要為其分配內(nèi)存。
動態(tài)創(chuàng)建會用到的函數(shù):
1)malloc函數(shù):在內(nèi)存中動態(tài)的分配一塊size大小的內(nèi)存空間。malloc函數(shù)會返回一個指針,指向分配的內(nèi)存空間,如果出現(xiàn)錯誤則返回NULL。
void *malloc(unsigned int size);
2)calloc函數(shù):在內(nèi)存中動態(tài)的分配n個長度為size的連續(xù)內(nèi)存空間數(shù)組。calloc函數(shù)會返回一個指針,指向動態(tài)分配的連續(xù)內(nèi)存空間地址,當分配出錯時,返回NULL.
void *calloc(unsigned n, unsigned size);
? ? ? ? ? 3)free函數(shù):使用由指針ptr指向的內(nèi)存區(qū),使部分內(nèi)存區(qū)能被其他變量使用。ptr是最近一次調(diào)用calloc或malloc函數(shù)時返回的值。free函數(shù)無返回值。
void free(void *ptr);
所謂建立動態(tài)鏈表就是指在程序運行過程中從無到有地建立一個鏈表,即一個一個的分配節(jié)點的內(nèi)存空間,然后輸入節(jié)點中的數(shù)據(jù)并建立節(jié)點間的相連關(guān)系。
14、共用體的概念:
共用體也稱為聯(lián)合體,它使幾種不同類型的變量存放到同一段內(nèi)存單元中。所以共用體子啊同一時刻只能有一個值,她屬于某一個數(shù)據(jù)成員。由于所有成員位于同一塊內(nèi)存,因此共用體的大小就等于最大成員的大小。
定義共用體變量的一般形式為:
union 共用體名
? ? ?{
? ? ? ? ? 成員列表
?????}變量列表;
15、共用體變量的引用
一般形式為:
共用體變量.成員名;
注意:不能直接引用共用體變量,如“printf("%d",variable);”
16、共用體變量的初始化
對共用體變量初始化時,只需要一個初始化值就足夠了,其類型必須和共用體的第一個成員的類型相一致。
如果共用體的第一個成員是一個結(jié)構(gòu)體類型,則初始化值中可以包含多個用于初始化該結(jié)構(gòu)的表達式。
17、共用體類型的數(shù)據(jù)特點
(1)同一個內(nèi)存段可以用來存放幾種不同類型的成員,但是每一種只能存放其中一種,而不是同時存放所有的類型。也就是說在共用體中,只有一個成員起作用,其他成員不起作用。
(2)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用。
(3)共用體變量的地址和它的各成員的地址是一樣的。
(4)不能對共用體變量賦值,也不能企圖引用變量名來得到一個值。
18、枚舉
利用關(guān)鍵字enum可以聲明枚舉類型,這也是一種數(shù)據(jù)類型。使用該類型可以定義枚舉類型變量,一個枚舉變量包含一組相關(guān)的標識符,其中每個標識符都對應(yīng)一個整數(shù)值,稱為枚舉變量。
例如定義一個枚舉類型變量,其中每個標識符都對應(yīng)一個整數(shù)值:
enum Colors(Red,Green, Blue);
?注意:每個標識符都必須是唯一的,而且不能采用關(guān)鍵字或當前作用域內(nèi)的其他相同的標識符。
在定義枚舉類型的變量時,可以為某個特定的標識符指定其對應(yīng)的整型值,緊隨其后的標識符對應(yīng)值以次加1.例如:
enum Colors(Red=1,Green,Blue);
這樣時,Red的值為1,Green的值是2,Blue的值是3
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的《c语言从入门到精通》看书笔记——第11章 结构体和共用体的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016-01-17
- 下一篇: 《c语言从入门到精通》看书笔记——第12