C語言之結構體、共用體、枚舉

結構體、共用體、枚舉
結構體的定義結構體指的是一種數據結構,是C語言中聚合數據類型的一類。結構體可以被聲明爲變量指針數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱爲結構體的成員,且這些成員可以爲不同的類型,成員一般用名字訪問。關鍵詞:struct
結構體的基本格式如下:
#include <stdio.h> 

struct student  //結構體類型的說明與定義分開。 聲明
{
	int age;   /*年齡*/
	float score;  /*分數*/
	char sex;     /*性別*/
};
int main()

{
	struct student a = { 20, 79, 'f' }; //定義
	printf("年齡:%d 分數:%.2f 性別:%c\n", a.age, a.score, a.sex);
	getchar();
	return 0;
}
打印結果如圖:
從上面的基本規律不難學習結構體的基本用法,與c++中的對象有些相似,主要的定義方式其實就是複製結構體名到main函數中,後跟一個類名(a)之後賦值結構體中每一項,要注意的是一一對應。共同體定義:在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量存放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同佔用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。關鍵詞:
union 共用體名
  {
  成員表列
  }變量表列;
示例如下:
union data
  {
  int i;
  char ch;
  float f;
  }a,b,c; [編輯本段]共用體變量的引用方式   只有先定義了共用體變量才能在後續程序中引用它,有一點需要注意:不能引用共用體變量,而只能引用共用體變量中的成員。

結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。

結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。

那麼共同體的簡單應用就到這。

枚舉類型的定義形式爲:

enum typeName{ valueName1, valueName2, valueName3, ...... };

enum是一個新的關鍵字,專門用來定義枚舉類型,這也是它在C語言中的唯一用途;typeName是枚舉類型的名字;valueName1, valueName2, valueName3, ......是每個值對應的名字的列表。注意最後的;不能少。

例如,列出一個星期有幾天:
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我們僅僅給出了名字,卻沒有給出名字對應的值,這是因爲枚舉值默認從 0 開始,往後逐個加 1(遞增);也就是說,week 中的 Mon、Tues ...... Sun 對應的值分別爲 0、1 ...... 6。

我們也可以給每個名字都指定一個值:
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
更爲簡單的方法是隻給第一個名字指定值:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
這樣枚舉值就從 1 開始遞增,跟上面的寫法是等效的。

枚舉是一種類型,通過它可以定義枚舉變量:
enum week a, b, c;
也可以在定義枚舉類型的同時定義變量:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚舉變量,就可以把列表中的值賦給它:
純文本複製
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
或者:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
枚舉的存在,其實就是爲了簡化代碼,能夠列出所有可能的取值,並給它們取一個名字。
需要注意的就是,枚舉定義的量屬於全局常量,在其他地方不能再有與之重名的量。

C語言允許爲一個數據類型起一個新的別名,就像給人起“綽號”一樣。

起別名的目的不是爲了提高程序運行效率,而是爲了編碼方便。例如有一個結構體的名字是 stu,要想定義一個結構體變量就得這樣寫:
struct stu stu1;
struct 看起來就是多餘的,但不寫又會報錯。如果爲 struct stu 起了一個別名 STU,書寫起來就簡單了:
STU stu1;
這種寫法更加簡練,意義也非常明確,不管是在標準頭文件中還是以後的編程實踐中,都會大量使用這種別名。

使用關鍵字 typedef 可以爲類型起一個新的別名,語法格式爲:
typedef  oldName  newName;
oldName 是類型原來的名字,newName 是類型新的名字。例如:
typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
INTEGER a, b;等效於int a, b;。
今天的學習的知識都非常的簡單,只要稍加理解都能靈活運用,同時,結構體可以嵌套的是可以肯定的。
也是從今天開始,與遊戲慢慢接近,變玩邊學,下面是C對傳奇中 人物屬性介紹的結構體:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>

struct attribute
{
	int life;	//生命值
	int mana;	//魔法值
	int internal;	//內功值
	int PhysicalF;	//物理防禦
	int MagicF;	//魔法防禦
	int PhysicalG;	//物理攻擊
	int MagicG;	//魔法攻擊
	int power;	//道術攻擊
	int dodge;		//閃避
	int accurate;		//準確度
	int lucky;		//幸運值
	int curse;		//詛咒值
	float crit;		//暴擊率
	int damage;	//暴擊力
};

struct role
{
	char name[50];		//人物名
	int Lv;			//等級
	char Vip;		//是否Vip
	char Buff;		//是否有buff
	char job[20];		//職業
	struct attribute figure1;	//屬性結構體
};

void main(){
	char a[50] = "";
	int n = 0;
	struct role person1 = { "我是超人", 60, 'T', 'T', "戰士", { 15516, 2430, 205, 796, 419, 997, 50, 50, 8, 30, 0, 0, 0.00, 0 } };
	printf("請輸入人物名:");		//printf("%d\n", person1.figure1.life);
	gets(a);
	/*if (strcmp(a[50], person1.name[50]) != 0){
		printf("您輸入的ID有誤\n");
		system("pause");
		return;
	}*/
	printf("登陸成功!\n%s\n是否Vip:%c\n是否有buff:%c\n職業:%s\n", person1.name, person1.Lv, person1.Vip, person1.job);
	printf("請輸入你要查看的序號:\n1、人物屬性  2、揹包\n");
	scanf("%d",&n);
	if (n == 1){
		printf("生命值:%d\n", person1.figure1.life);
		printf("魔法值:%d\n", person1.figure1.mana);
		printf("內功值:%d\n", person1.figure1.internal);
		printf("物理防禦:%d\n", person1.figure1.PhysicalF);
		printf("魔法防禦:%d\n", person1.figure1.MagicF);
		printf("物理攻擊:%d\n", person1.figure1.PhysicalG);
		printf("魔法攻擊:%d\n", person1.figure1.MagicG);
		printf("道術攻擊:%d\n", person1.figure1.power);
		printf("閃避:%d\n", person1.figure1.dodge);
		printf("準確度:%d\n", person1.figure1.accurate);
		printf("幸運值:%d\n", person1.figure1.lucky);
		printf("詛咒值:%d\n", person1.figure1.curse);
		printf("暴擊率:%f\n", person1.figure1.crit);
		printf("暴擊力:%d\n", person1.figure1.damage);
	}
	system("pause");
	return;
}

上面用到的嵌套可以加以分析~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章