亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

首先結(jié)構(gòu)體的出現(xiàn)是因為我們使用C語言的基本類型無法滿足我們的需求,比如我們要描述一本書,就需要書名,作者,價格,出版社等等一系列的屬性,無疑C語言的基本數(shù)據(jù)類型無法解決,所以就出現(xiàn)了最重要的自定義數(shù)據(jù)類型,結(jié)構(gòu)體。

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

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

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

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

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

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

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

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

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

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

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

總的來說,結(jié)構(gòu)體的內(nèi)存對齊是拿空間來換取時間的做法,結(jié)構(gòu)體就介紹的差不多了,下面我們來看看枚舉

枚舉基礎(chǔ)知識

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

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

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

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

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

聯(lián)合體

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

上面黑色和紅色的重疊部分就是共用的區(qū)域,兩個變量都能使用它,這個東西很少用的就不多講了,唯一記住的就是,聯(lián)合體可以求當(dāng)前編譯環(huán)境是大端字節(jié)序存儲模式還是小端字節(jié)序存儲模式,至于怎么求,看看下面這個代碼,應(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) {//取出第一個字節(jié)的內(nèi)容判斷
		printf("小端");
	}
	else {
		printf("大端");
	}
	return 0;
}

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

一些小結(jié)和建議

1.盡量不要使用聯(lián)合體,因為一次修改會導(dǎo)致多個數(shù)據(jù)被修改,容易出現(xiàn)不可預(yù)料的問題.

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

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

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

寫在最后的話

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

相關(guān)文章

  • C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn)

    C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn)

    這篇文章主要介紹了C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • VC++中HTControl的CHTButton按鈕控件類用法實例解析

    VC++中HTControl的CHTButton按鈕控件類用法實例解析

    這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進(jìn)行VC++項目開發(fā)有一定的幫助作用,需要的朋友可以參考下
    2014-08-08
  • c++并查集優(yōu)化(基于size和rank)

    c++并查集優(yōu)化(基于size和rank)

    這篇文章主要介紹了c++并查集優(yōu)化(基于size和rank),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言中字符的輸入輸出以及計算字符個數(shù)的方法詳解

    C語言中字符的輸入輸出以及計算字符個數(shù)的方法詳解

    這篇文章主要介紹了C語言中字符的輸入輸出以及計算字符個數(shù)的方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • C++實現(xiàn)LeetCode(5.最長回文子串)

    C++實現(xiàn)LeetCode(5.最長回文子串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(5.最長回文子串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • OpenCV實現(xiàn)直線擬合

    OpenCV實現(xiàn)直線擬合

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)直線擬合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++實現(xiàn)LeetCode(642.設(shè)計搜索自動補(bǔ)全系統(tǒng))

    C++實現(xiàn)LeetCode(642.設(shè)計搜索自動補(bǔ)全系統(tǒng))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(642.設(shè)計搜索自動補(bǔ)全系統(tǒng)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 利用C/C++二進(jìn)制讀寫png文件的方法示例

    利用C/C++二進(jìn)制讀寫png文件的方法示例

    最近在做項目的時候遇到了這個問題,所以想著總結(jié)下,方法自己和有需要的朋友,下面這篇文章主要介紹了利用C/C++二進(jìn)制讀寫png文件的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C++關(guān)于樹的定義全面梳理

    C++關(guān)于樹的定義全面梳理

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點)按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06
  • C語言清除scanf()緩存的案例講解

    C語言清除scanf()緩存的案例講解

    今天小編就為大家分享一篇關(guān)于C語言清除scanf()緩存的案例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論