最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言自定義數(shù)據(jù)類(lèi)型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解

 更新時(shí)間:2021年05月07日 11:28:32   作者:JunFengYiHan  
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言自定義數(shù)據(jù)類(lèi)型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

結(jié)構(gòu)體基礎(chǔ)知識(shí)

首先結(jié)構(gòu)體的出現(xiàn)是因?yàn)槲覀兪褂肅語(yǔ)言的基本類(lèi)型無(wú)法滿(mǎn)足我們的需求,比如我們要描述一本書(shū),就需要書(shū)名,作者,價(jià)格,出版社等等一系列的屬性,無(wú)疑C語(yǔ)言的基本數(shù)據(jù)類(lèi)型無(wú)法解決,所以就出現(xiàn)了最重要的自定義數(shù)據(jù)類(lèi)型,結(jié)構(gòu)體。

首先我們創(chuàng)建一個(gè)書(shū)的結(jié)構(gòu)體類(lèi)型來(lái)認(rèn)識(shí)一下

struct Book
{
	char name[20];
	char author[20];
	int price;
};

首先是struct是結(jié)構(gòu)體關(guān)鍵字,用來(lái)告訴編譯器你這里聲明的是一個(gè)結(jié)構(gòu)體類(lèi)型而不是其他的東西,然后是Book是結(jié)構(gòu)體標(biāo)簽,而關(guān)鍵字加標(biāo)簽就是你結(jié)構(gòu)體類(lèi)型的名字,即struct Book 是你結(jié)構(gòu)體類(lèi)型的名字,然后看到結(jié)構(gòu)體里面的內(nèi)容,即大括號(hào)里面的內(nèi)容,有兩個(gè)字符數(shù)組和一個(gè)整型變量,一個(gè)數(shù)組用來(lái)存放書(shū)的名字,一個(gè)數(shù)組用來(lái)存放書(shū)的作者,整型變量用來(lái)存放書(shū)的價(jià)格,在類(lèi)型聲明中需要多少變量就放入多少變量,需要什么變量就放入什么變量,而這些變量就是結(jié)構(gòu)體的成員變量,成員變量可以是不同的類(lèi)型,注意,結(jié)構(gòu)體聲明的末尾分號(hào)不可省略,到此我們已經(jīng)有了基本的認(rèn)識(shí),接下來(lái)我們來(lái)使用一下結(jié)構(gòu)體類(lèi)型,既然是類(lèi)型,那么肯定就可以拿來(lái)創(chuàng)建變量,我們就拿上面那個(gè)描述書(shū)的結(jié)構(gòu)體類(lèi)型試一下

可以看到使用規(guī)則和基本數(shù)據(jù)類(lèi)型之類(lèi)的并無(wú)太大區(qū)別,唯一區(qū)別就是結(jié)構(gòu)體初始化一定要用大括號(hào)將初始化的內(nèi)容括起來(lái),如果不是初始化那么就需要先訪(fǎng)問(wèn)他的成員才能一一賦值,這里我們是在創(chuàng)建結(jié)構(gòu)體的時(shí)候?qū)λM(jìn)行了初始化,放入了一些數(shù)據(jù),小伙伴們能夠清楚的看到屏幕上輸出了這些數(shù)據(jù),其中通過(guò)結(jié)構(gòu)體變量訪(fǎng)問(wèn)結(jié)構(gòu)體成員的時(shí)候使用了點(diǎn)號(hào). 這個(gè)點(diǎn)號(hào)是結(jié)構(gòu)體成員訪(fǎng)問(wèn)操作符,通過(guò)它我們就可以拿到結(jié)構(gòu)體的成員,看完之后小伙伴們最好是自己也敲一下試試,代碼能力是練出來(lái)的,初學(xué)時(shí)一定要多敲多練,到此結(jié)構(gòu)體基礎(chǔ)知識(shí)我們就介紹完了,接下來(lái)我們來(lái)進(jìn)階一下。

結(jié)構(gòu)體進(jìn)階知識(shí)

首先結(jié)構(gòu)體是可以嵌套定義的,像下面這樣

結(jié)構(gòu)體計(jì)算大小

結(jié)構(gòu)體在分配內(nèi)存的時(shí)候,會(huì)發(fā)生結(jié)構(gòu)體內(nèi)存對(duì)齊,對(duì)齊規(guī)則如下:

  • 第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
  • 其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。
  • 結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(每個(gè)成員變量都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
  • 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。

知道了規(guī)則我們來(lái)用一下,下面這個(gè)結(jié)構(gòu)體的大小不考慮對(duì)齊的情況只需要6byte的空間就能存下所有數(shù)據(jù),但是考慮到內(nèi)存對(duì)齊就需要12byte的空間,這就足足多了一倍的空間,那么為什么還需要這個(gè)對(duì)齊的規(guī)則呢,原因大致有以下兩點(diǎn):

  • 平臺(tái)原因(移植原因): 不是所有的硬件平臺(tái)都能訪(fǎng)問(wèn)任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類(lèi)型的數(shù)據(jù),否則拋出硬件異常。
  • 性能原因: 數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。 原因在于,為了訪(fǎng)問(wèn)未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪(fǎng)問(wèn);而對(duì)齊的內(nèi)存訪(fǎng)問(wèn)僅需要一次訪(fǎng)問(wèn)。
struct S1
{
 char c1;//1 byte
 int i;//4byte
 char c2;//1byte
};
printf("%d\n", sizeof(struct S1));

總的來(lái)說(shuō),結(jié)構(gòu)體的內(nèi)存對(duì)齊是拿空間來(lái)?yè)Q取時(shí)間的做法,結(jié)構(gòu)體就介紹的差不多了,下面我們來(lái)看看枚舉

枚舉基礎(chǔ)知識(shí)

枚舉顧名思義就是把所有的可能性 一 一 列舉出來(lái),比如說(shuō)一個(gè)星期分為星期一,星期二到星期天七天我們就可以使用枚舉

enum Day
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

和結(jié)構(gòu)體一樣首先是枚舉關(guān)鍵字enmu然后是枚舉的標(biāo)簽Day,然后是成員,但是和結(jié)構(gòu)體不同的是,枚舉的成員是常量,而且是整型常量,并且不賦值的話(huà)是有默認(rèn)值,而且默認(rèn)值是向下依次遞增1的,我們來(lái)看看就知道了

可以看到不主動(dòng)賦值的情況下,下一個(gè)比上一個(gè)大1,并且第一個(gè)默認(rèn)為0,看看賦值了的

枚舉就這么簡(jiǎn)單,接下來(lái)看看聯(lián)合體

聯(lián)合體

聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和結(jié)構(gòu)體和枚舉是一樣的定義方式,和前面兩個(gè)不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,這句話(huà)什么意思呢,就相當(dāng)于只開(kāi)辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間(空間可以被重疊占用)看看下面的圖片

上面黑色和紅色的重疊部分就是共用的區(qū)域,兩個(gè)變量都能使用它,這個(gè)東西很少用的就不多講了,唯一記住的就是,聯(lián)合體可以求當(dāng)前編譯環(huán)境是大端字節(jié)序存儲(chǔ)模式還是小端字節(jié)序存儲(chǔ)模式,至于怎么求,看看下面這個(gè)代碼,應(yīng)該很好理解

#include<stdio.h>
union Un{
	char ch;
	int n;
};
int main()
{
	union Un un;
	un.n = 1;
	//小端 01 00 00 00
	//大端 00 00 00 01
	if (un.ch == 1) {//取出第一個(gè)字節(jié)的內(nèi)容判斷
		printf("小端");
	}
	else {
		printf("大端");
	}
	return 0;
}

這個(gè)東西理解不了也沒(méi)啥關(guān)系,一般用不上。

一些小結(jié)和建議

1.盡量不要使用聯(lián)合體,因?yàn)橐淮涡薷臅?huì)導(dǎo)致多個(gè)數(shù)據(jù)被修改,容易出現(xiàn)不可預(yù)料的問(wèn)題.

2.結(jié)構(gòu)體內(nèi)存對(duì)齊一定要學(xué)會(huì)計(jì)算,雖然實(shí)際可能用不上,但是可能會(huì)面試中出現(xiàn).

3.結(jié)構(gòu)體中還有一個(gè)叫字段的知識(shí)點(diǎn),形式如下,這個(gè)東西現(xiàn)在用于傳輸數(shù)據(jù),后端開(kāi)發(fā)一般用不上,所以博主沒(méi)講,感興趣的小伙伴就自行百度了解一下吧

4.枚舉一般搭配switch語(yǔ)句使用,可以提高代碼的可讀性。

寫(xiě)在最后的話(huà)

到此這篇關(guān)于C語(yǔ)言自定義數(shù)據(jù)類(lèi)型的結(jié)構(gòu)體、枚舉和聯(lián)合詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言自定義數(shù)據(jù)類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中system()執(zhí)行cmd命令打開(kāi)關(guān)閉程序的方法

    C語(yǔ)言中system()執(zhí)行cmd命令打開(kāi)關(guān)閉程序的方法

    今天小編就為大家分享一篇C語(yǔ)言中system()執(zhí)行cmd命令打開(kāi)關(guān)閉程序的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • C語(yǔ)言關(guān)鍵字const和指針的結(jié)合使用

    C語(yǔ)言關(guān)鍵字const和指針的結(jié)合使用

    這篇文章主要介紹了C語(yǔ)言關(guān)鍵字const和指針的結(jié)合,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C語(yǔ)言如何改變字體顏色

    C語(yǔ)言如何改變字體顏色

    這篇文章主要介紹了C語(yǔ)言如何改變字體顏色,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • C++實(shí)現(xiàn)將簡(jiǎn)單密碼譯回原文的方法

    C++實(shí)現(xiàn)將簡(jiǎn)單密碼譯回原文的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)將簡(jiǎn)單密碼譯回原文的方法,可實(shí)現(xiàn)將簡(jiǎn)單的字母位移類(lèi)型的密碼譯回原文的功能,涉及C++簡(jiǎn)單字符串操作相關(guān)技巧,需要的朋友可以參考下
    2016-05-05
  • C語(yǔ)言中大小寫(xiě)字母相互轉(zhuǎn)化的方法示例

    C語(yǔ)言中大小寫(xiě)字母相互轉(zhuǎn)化的方法示例

    在C語(yǔ)言中,大小寫(xiě)字母的轉(zhuǎn)換可以通過(guò)標(biāo)準(zhǔn)庫(kù)中的ctype.h頭文件提供的函數(shù)來(lái)實(shí)現(xiàn),具體來(lái)說(shuō),toupper()函數(shù)可以將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母,而tolower()函數(shù)可以將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母,本文給大家介紹了C語(yǔ)言中大小寫(xiě)字母相互轉(zhuǎn)化的方法,需要的朋友可以參考下
    2024-08-08
  • C++實(shí)現(xiàn)LeetCode(161.一個(gè)編輯距離)

    C++實(shí)現(xiàn)LeetCode(161.一個(gè)編輯距離)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(161.一個(gè)編輯距離),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++任意線(xiàn)程通過(guò)hwnd實(shí)現(xiàn)將操作發(fā)送到UI線(xiàn)程執(zhí)行

    C++任意線(xiàn)程通過(guò)hwnd實(shí)現(xiàn)將操作發(fā)送到UI線(xiàn)程執(zhí)行

    做Windows界面開(kāi)發(fā)時(shí),經(jīng)常需要在多線(xiàn)程環(huán)境中將操作拋到主線(xiàn)程執(zhí)行,下面我們就來(lái)學(xué)習(xí)一下如何在不需要重新定義消息以及接收消息的情況下實(shí)現(xiàn)這一要求,感興趣的可以了解下
    2024-03-03
  • 如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器詳解

    如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器詳解

    這篇文章主要給大家介紹了關(guān)于如何在C++中實(shí)現(xiàn)一個(gè)正確的時(shí)間循環(huán)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C++實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列詳解

    C++實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的生產(chǎn)者-消費(fèi)者隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • 詳析C++中的auto

    詳析C++中的auto

    這篇文章主要介紹了詳析C++中的auto,auto是具有自動(dòng)存儲(chǔ)器的局部變量,C++11中,標(biāo)準(zhǔn)委員會(huì)賦予了auto全新的含義即:auto不再是一個(gè)存儲(chǔ)類(lèi)型指示符,而作為一個(gè)新的類(lèi)型指示符來(lái)指示編譯器,下面來(lái)看看文章的詳細(xì)介紹吧
    2022-01-01

最新評(píng)論

五常市| 河东区| 水城县| 远安县| 博野县| 来安县| 元朗区| 安溪县| 长岛县| 比如县| 日喀则市| 通州市| 望江县| 科技| 蕉岭县| 曲阳县| 潼关县| 天祝| 长汀县| 吴旗县| 四平市| 周至县| 宁津县| 镇康县| 沈丘县| 咸阳市| 共和县| 霍山县| 平陆县| 石门县| 佛学| 建始县| 塔河县| 柞水县| 宿迁市| 沧源| 平湖市| 通江县| 清水县| 宜城市| 汕头市|