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

C語(yǔ)言:自定義類(lèi)型詳解

 更新時(shí)間:2021年09月24日 16:25:44   作者:今天我學(xué)習(xí)了!  
這篇文章主要介紹了C語(yǔ)言自定義函數(shù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、結(jié)構(gòu)體

1.結(jié)構(gòu)體變量的定義及初始化

直接上代碼:

struct Point {
	int x;
	int y;
}p1;     //創(chuàng)建結(jié)構(gòu)體時(shí)順便創(chuàng)建變量,分號(hào)一定不能掉
struct Point p2;    //單獨(dú)創(chuàng)建變量
struct Point p3 = { 1,2 };   //創(chuàng)建變量時(shí)順便賦值
struct Node {
	char str[20];
	struct Point p;     //結(jié)構(gòu)體嵌套
}n1 = { "abcd",{3,4} };
int main() {
	printf("%s\n", n1.str);   //結(jié)構(gòu)體訪問(wèn)時(shí),用.或者->,變量訪問(wèn)用.,指針訪問(wèn)用->
	printf("%d\n", n1.p.x);
	printf("%d\n", n1.p.y);
	return 0;
}

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-A5K0M4H1-1632400370757)(C:\Users\10371\AppData\Roaming\Typora\typora-user-images\image-20210923190038919.png)]

struct是創(chuàng)建結(jié)構(gòu)體的關(guān)鍵字,Point是結(jié)構(gòu)體的名字,p1為結(jié)構(gòu)體Point的一個(gè)變量,x,y稱(chēng)為結(jié)構(gòu)體Point中的成員變量,變量的創(chuàng)建有兩種形式,第一,可以在創(chuàng)建結(jié)構(gòu)體時(shí)一起創(chuàng)建,第二,單獨(dú)創(chuàng)建,創(chuàng)建規(guī)則為類(lèi)型+名稱(chēng),對(duì)于結(jié)構(gòu)體的賦值,可以在創(chuàng)建變量的時(shí)候順便賦值,可以先創(chuàng)建變量再單獨(dú)賦值。結(jié)構(gòu)體的訪問(wèn)有兩種方式,當(dāng)使用變量進(jìn)行訪問(wèn)時(shí),用.(點(diǎn)),再選擇該變量對(duì)應(yīng)的屬性;當(dāng)使用指針進(jìn)行訪問(wèn)時(shí),用->,再選擇對(duì)應(yīng)的屬性即可。

2.結(jié)構(gòu)體內(nèi)存對(duì)齊

當(dāng)我們想去計(jì)算結(jié)構(gòu)體占內(nèi)存大小的時(shí)候,就需要知道結(jié)構(gòu)圖內(nèi)存對(duì)齊這一概念,我們先來(lái)看兩個(gè)例子:

struct A {
	char a;
	char b;
	int c;
};
struct B {
	char a;
	int c;
	char b;
};
int main(){
	printf("%d\n", sizeof(struct A));
	printf("%d\n", sizeof(struct B));
	return 0;
}

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-u9hpNrap-1632400370761)(C:\Users\10371\AppData\Roaming\Typora\typora-user-images\image-20210923190325486.png)]

結(jié)果表明,A和B兩個(gè)結(jié)構(gòu)體所占內(nèi)存大小并不相等,但是其內(nèi)部成員變量是一樣的,只是順序不一樣。造成結(jié)果不同的原因就是因?yàn)閮?nèi)存對(duì)齊,我們來(lái)介紹結(jié)構(gòu)體內(nèi)存對(duì)齊的規(guī)則:

1.第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。

其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。 對(duì)齊數(shù) = 編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值。在VS編譯器中,默認(rèn)對(duì)齊數(shù)是8。

結(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ù)倍。

3.為什么要內(nèi)存對(duì)齊呢?

從上面的結(jié)果我們大概就能猜到,為了節(jié)省空間??偟膩?lái)說(shuō),主要原因有兩點(diǎn):

1.平臺(tái)原因:

某些硬件平臺(tái)只能在特定的地址處取地址,沒(méi)有內(nèi)存對(duì)齊,取值時(shí)可能會(huì)出錯(cuò)。

2.性能原因:

對(duì)于不對(duì)齊的情況,在讀取數(shù)據(jù)時(shí)可能要讀取兩次,以下圖為例:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-jchW9qWz-1632400370763)(C:\Users\10371\AppData\Roaming\Typora\typora-user-images\image-20210923192716935.png)]

在一個(gè)32位平臺(tái)上,在不對(duì)齊的情況下,如果想要讀取int的4個(gè)字節(jié),第一次會(huì)讀取到char的一個(gè)字節(jié),和int的后3個(gè)字節(jié)(小端),需要再讀取一次,才能將int的4個(gè)字節(jié)完全讀取出來(lái);相比較而言,如果是在內(nèi)存對(duì)齊的情況下,只需要讀取一次就可以把int的4個(gè)直接讀取出來(lái)。

二、位段

結(jié)構(gòu)體還有實(shí)現(xiàn)位段的能力,問(wèn)題來(lái)了,什么是位段呢?

1.什么是位段

位段的聲明和結(jié)構(gòu)體是類(lèi)似的,但有兩點(diǎn)不同:

  • 位段的成員必須是 int、unsigned int 或signed int 。
  • 位段的成員名后邊有一個(gè)冒號(hào)和一個(gè)數(shù)字。

例如:

struct A
{
 int _a:2;
 int _b:5;
 int _c:3;
 int _d:4;
};

A就是一個(gè)位段類(lèi)型,想要知道A的大小,同樣可以用sizeof來(lái)求。

2.位段的內(nèi)存分配

拿上面的位段A來(lái)說(shuō),會(huì)先在內(nèi)存中開(kāi)辟一個(gè)4字節(jié)的空間,冒號(hào)后面的數(shù)字表示該成員變量所占內(nèi)存的大小,單位為bit,位段中的成員在內(nèi)存中從左向右分配, 當(dāng)一個(gè)結(jié)構(gòu)包含兩個(gè)位段,第二個(gè)位段成員比較大,無(wú)法容納于第一個(gè)位段剩余的位時(shí),是 舍棄剩余的位還是利用,這是不確定的??偟膩?lái)說(shuō),跟結(jié)構(gòu)相比,位段可以達(dá)到同樣的效果,但是可以很好的節(jié)省空間,但是有跨平臺(tái)的問(wèn)題存在。光說(shuō)不太好理解,我們來(lái)看下圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ey3DDX7A-1632400370764)(C:\Users\10371\AppData\Roaming\Typora\typora-user-images\image-20210923200518727.png)]

當(dāng)然,位段雖然比結(jié)構(gòu)體更節(jié)省內(nèi)存,但其存在跨平臺(tái)問(wèn)題,需要謹(jǐn)慎使用。

三、枚舉

1.枚舉的定義

enum Day//星期
{
 Mon,  //默認(rèn)情況下Mon值為0,后面的成員變量的值依次遞增
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

當(dāng)然也可以在定義的時(shí)候賦值,例如:

enum Color//顏色
{
 RED=1,
 GREEN=2,
 BLUE=4
};

2.枚舉的優(yōu)點(diǎn)

我們知道,#define可以定義常量,那為什么要用枚舉呢?

枚舉的優(yōu)點(diǎn):

1.增加代碼的可讀性和可維護(hù)性

2.和#define定義的標(biāo)識(shí)符比較枚舉有類(lèi)型檢查,更加嚴(yán)謹(jǐn)。

3.使用方便,一次可以定義多個(gè)常量

既然存在,就有其存在的道理,有些時(shí)候#define更方便,有時(shí)候枚舉更方便,我們要學(xué)會(huì)合理使用

四、聯(lián)合(共用體)

1.聯(lián)合類(lèi)型的定義

union Un  //聲明
{
 char c;
 int i;
};
union Un un;  //定義變量
printf("%d\n", sizeof(un));  //計(jì)算共用體的大小

2.聯(lián)合的特點(diǎn)

聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個(gè)聯(lián)合變量的大小,至少是最大成員的大小(因?yàn)?聯(lián)合至少得有能力保存最大的那個(gè)成員)。

union Un
{
 int i;
 char c;
};
union Un un;
// 下面輸出的結(jié)果是一樣的嗎?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面輸出的結(jié)果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6pp4XA6e-1632400370765)(C:\Users\10371\AppData\Roaming\Typora\typora-user-images\image-20210923202148509.png)]

從結(jié)果可以看出,i和c的地址是一樣的,因?yàn)樗麄児灿靡粔K空間,當(dāng)分別給i、c賦值時(shí),后賦值的c會(huì)覆蓋之前i的部分值。

3.聯(lián)合大小的計(jì)算

  • 聯(lián)合的大小至少是最大成員的大小。
  • 當(dāng)最大成員大小不是最大對(duì)齊數(shù)的整數(shù)倍的時(shí)候,就要對(duì)齊到最大對(duì)齊數(shù)的整數(shù)倍。

例如:

union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};
//下面輸出的結(jié)果是什么?
printf("%d\n", sizeof(union Un1));  //8,c占5個(gè)字節(jié),比i大,最大對(duì)齊數(shù)位4,需要為4的倍數(shù),所以為8
printf("%d\n", sizeof(union Un2));  //16,c占14個(gè)字節(jié),最大對(duì)齊數(shù)為4,所以為16

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++ primer基礎(chǔ)之容器insert

    C++ primer基礎(chǔ)之容器insert

    這篇文章主要介紹了C++ primer基礎(chǔ)之容器insert的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C語(yǔ)言JNI的動(dòng)態(tài)注冊(cè)詳解

    C語(yǔ)言JNI的動(dòng)態(tài)注冊(cè)詳解

    這篇文章主要介紹了JAVA JNI的動(dòng)態(tài)注冊(cè),這里提供簡(jiǎn)單實(shí)例代碼,需要的朋友可以參考下,小編覺(jué)得寫(xiě)的還不錯(cuò),希望能給你帶來(lái)幫助
    2021-08-08
  • 基于對(duì)話(huà)框程序中讓對(duì)話(huà)框捕獲WM_KEYDOWN消息的實(shí)現(xiàn)方法

    基于對(duì)話(huà)框程序中讓對(duì)話(huà)框捕獲WM_KEYDOWN消息的實(shí)現(xiàn)方法

    下面我們將通過(guò)程序給大家演示基于對(duì)話(huà)框的應(yīng)用程序?qū)M_KEYDOWN消息的捕獲。需要的朋友可以參考下
    2013-05-05
  • C++ string 字符串查找匹配實(shí)例代碼

    C++ string 字符串查找匹配實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇C++ string 字符串查找匹配實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • C++  boost 時(shí)間與日期處理詳細(xì)介紹

    C++ boost 時(shí)間與日期處理詳細(xì)介紹

    這篇文章主要介紹了C++ boost 時(shí)間與日期處理詳細(xì)介紹的相關(guān)資料,這里提供實(shí)例代碼,及實(shí)現(xiàn)效果,需要的朋友可以參考下
    2016-11-11
  • C++中move的使用及說(shuō)明

    C++中move的使用及說(shuō)明

    這篇文章主要介紹了C++中move的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言的數(shù)組指針與函數(shù)指針詳解

    C語(yǔ)言的數(shù)組指針與函數(shù)指針詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的數(shù)組指針與函數(shù)指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 基于C語(yǔ)言實(shí)現(xiàn)高級(jí)通訊錄的示例代碼

    基于C語(yǔ)言實(shí)現(xiàn)高級(jí)通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)高級(jí)通訊錄的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下
    2023-01-01
  • C++20 格式化字符串的實(shí)現(xiàn)

    C++20 格式化字符串的實(shí)現(xiàn)

    本文主要講述了C++20中新引入的std::format功能,該功能用于格式化字符串,提供了一種簡(jiǎn)潔、類(lèi)型安全且靈活的方式來(lái)構(gòu)建格式化字符串,文章從使用場(chǎng)景、格式化規(guī)則、自定義類(lèi)型的格式化等方面進(jìn)行了詳細(xì)的介紹,感興趣的可以了解一下
    2024-10-10
  • 讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    讓我們一起來(lái)對(duì)C語(yǔ)言指針再分析

    這篇文章主要為大家詳細(xì)介紹C語(yǔ)言的指針,本文進(jìn)行了深度解析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01

最新評(píng)論

伊宁市| 大关县| 靖远县| 凤山县| 布拖县| 绿春县| 左贡县| 澳门| 永福县| 晴隆县| 韶关市| 利津县| 灯塔市| 新疆| 高邮市| 古交市| 亚东县| 鲁山县| 宝坻区| 汉中市| 永城市| 兰坪| 大埔县| 乌兰察布市| 嘉义县| 双桥区| 同江市| 纳雍县| 石景山区| 海晏县| 南靖县| 五峰| 旌德县| 台山市| 彰化县| 陈巴尔虎旗| 比如县| 大石桥市| 奉节县| 武山县| 香港 |