日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言自定義類型超詳細梳理之結構體?枚舉?聯合體_C 語言

作者:K穩重 ? 更新時間: 2022-05-18 編程語言

一、什么是結構體

結構是一些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。

//結構體聲明
struct tag //struct:結構體關鍵字,tag:標簽名,合起來是結構體類型(類型名)
{
	member - list;//大括號里面的是結構體成員變量
}variable - list;//結構體變量

1.結構體實現

代碼如下:

#include
 
struct Book
{
	char name[20];//書名
	int price;//價格
	char id[20];//書號
}b2,b3,b4;//結構體變量(全局變量)
int main()
{   //結構體變量(局部變量)
	struct Book b1 = { "c和指針", 30, "1112345454" };//結構體初始化
	struct Book* pb = &b1;
	printf("%s %d %s\n",b1.name,b1.price,b1.id );
	printf("%s %d %s\n", pb->name, pb->price, pb->id);//指針方式打印
 
	return 0;
}

2.匿名結構體類型

//匿名結構體類型
struct
{
 int a;
 char b;
 float c;
}s;//直接永匿名結構體類型創建了一個變量s,匿名結構體只能用一次
 
struct
{
 int a;
 char b;
 float c;
}*ps;//匿名結構體的指針
 
結構在聲明的時候省略掉了結構體標簽(tag)就叫做匿名結構體。
 
 
那么問題來了?
int main()
{
  ps = &s;//不合法,編譯器會把上面的兩個聲明當成完全不同的兩個類型。
所以是非法的
}

3.結構體自引用

struct Node
{
    int data;
    struct Node* next;
}
//結構體自引用
//這個節點能夠找到同類型的下一個節點,這就叫結構體的自引用,我自己能找到同類型跟自己同類型的下一個元素就叫結構體的自引用。
//結構體的自引用實現:在結構體里面包含同類型的結構體的指針。

4.結構體的內存對齊

首先得掌握結構體的對齊規則:

1. 第一個成員在與結構體變量偏移量為0的地址處。

2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。 對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。 VS中默認的值為8

3. 結構體總大小為最大對齊數(每個成員變量都有一個對齊數)的整數倍。

4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整 體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。

我們來算一下上面結構體S內存大小為什么是12個字節

我用到編譯器是vs,vs編譯器的默認對齊數是8.

1.結構體的第一個成員,放在結構體變量在內存中儲存位置的0偏移處開始。

2.從第二個成員往后的所有成員,都放在一個對齊數(成員的大小和默認對齊數的較小值)的整數的整數倍的地址處。

3.結構體的總大小是結構體的所有成員的對齊數中最大的那個對齊數的整數倍。

5.結構體位段

位段的聲明和結構是類似的,有兩個不同:

1.位段的成員必須是 int、unsigned int 或signed int 。

2.位段的成員名后邊有一個冒號和一個數字。

假設我們用二進制的方式來表示性別,分為男、女、保密。可以用00、01、10分別表示。這樣我們連一個字節的大小都用不到,但如果我們創建變量,一個int變量就占四個字節,所以說位段在一定程度上節省了空間。

位段的內存分配

1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型

2. 位段的空間上是按照需要以4個字節( int )或者1個字節( char )的方式來開辟的。

3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。

?二、什么是枚舉

性別有:男、女、保密,也可以一一列舉。

月份有12個月,也可以一一列舉

這里就可以使用枚舉了。

枚舉是要創造出一種新的類型,這種類型的取值是非常有限的,明確的只有那么幾種可能取值,我們就可以用枚舉來創造一個枚舉類型

枚舉類型的大小就是4.

1.枚舉類型的定義

#include
//聲明枚舉類型
enum Color//enum枚舉關鍵字,Color枚舉類型,
{
	RED,//大括號里面放的是枚舉的可能取值(常量)
	GREEN,
	BLUE
};
int main()
{
	enum Color c = BLUE;
	return 0;
}

大括號里面這些可能取值都是有值的,默認從0開始,一次遞增1,當然在定義的時候也可以賦初值。

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

2.枚舉的優點

我們可以使用 #define 定義常量,為什么非要使用枚舉?

枚舉的優點:

1. 增加代碼的可讀性和可維護性

2. 和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。

3. 防止了命名污染(封裝)

4. 便于調試

5. 使用方便,一次可以定義多個常量

三、聯合(共用體)

1.什么是聯合(共用體)

聯合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(所以聯合也叫共用體)。

2.聯合(共用體)的定義

//聯合類型的聲明
union Un
{
 char c;
 int i;
};
//聯合變量的定義
union Un un;
//計算連個變量的大小
printf("%d\n", sizeof(un));

計算聯合(共用體)的大小

?這里為什么算出的結果是4呢,我們看下圖:

聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯 合至少得有能力保存最大的那個成員)。

3.聯合(共用體)的初始化

#include
 
union Un
{
	char c;
	int i;
};
int main()
{
	union Un u = { 10 };//初始化
	u.i = 1000;//成員變量單獨初始化
	u.c = 100;
	printf("%p\n",&u );
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));
	return 0;
}

總結

這樣就簡單介紹完了結構體,枚舉和聯合體的定義,初始化,和簡單的使用。寫的比較潦草,如果上述文章有任何問題?,歡迎大佬們提出質疑,我會虛心學習和改正,最重要的是能共同進步,共同成長,學習好編程。

原文鏈接:https://blog.csdn.net/m0_64397675/article/details/122877148

欄目分類
最近更新