日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《c语言从入门到精通》看书笔记——第11章 结构体和共用体

發(fā)布時間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。