1. 程式人生 > >C語言之結構體、共用體、列舉

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

結構體的基本格式如下:
#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;
}

上面用到的巢狀可以加以分析~~

相關推薦

11C語言結構共用

結構體數組 結構體 float add font sco 規則 student mon 一、結構體   結構體:是一種自定義的構造數據類型   用途:把不同類型的數據組合成一個整體。     結構體類型定義:     struct [結構體名]    {       類型識

1-C語言結構共用列舉

一、關鍵字說明         C語言有32個關鍵字,C語言通過關鍵字的使用使編譯器進行相關的操作          結構體對應關鍵字struct          共用體(聯合體)對應的關鍵字是union          列舉型別對應的關鍵字是enum 二、結構

C語言結構共用列舉

結構體的基本格式如下:#include <stdio.h> struct student //結構體型別的說明與定義分開。 宣告 { int age; /*年齡*/ float score; /*分數*/ char sex; /*性別*/ }; int main() {

C語言結構 共用 列舉 typedef

結構體型別和結構體變數, struct 定義結構體型別時 不佔記憶體 匿名結構體,無法建立變數訪問,有限的結構體型別變數 結構體變數不能整體引用,只能引用變數成員 結構體變數用大括號賦值,只有在建立並初始化的時候才可以 #define _CRT_SECURE_NO_WARN

C 語言結構

ons nbsp span clas %d str style ret [] 1 #include <stdio.h> 2 3 #include <struct.h> 4 5 #include <string.h>

C語言結構巢狀一級指標和二級指標

指標是C語言的精華,也是c中最難的部分;為了鍛鍊和提高自己對指標的理解,特在結構體中巢狀一級指標和二級指標來加深對。 #include<stdio.h> #include <string.h> #include<stdlib.h&

C語言查缺補漏(九)共用列舉型別

忽略點九:共用體與列舉型別 ​ 共用體?What?它是什麼,上了兩年大學的我有點懵逼。共用體已然成了我C語言的盲區。 ​ 存在必然有它的意義,所以惡補了一下有關共用體的知識。 ​ 在我的理解裡,共用體和上一篇博文所介紹的結構體,都是用來儲存不同資料型別的“容器”

c語言結構

c語言 成員 strong 定義 clas style class str blog 定義結構: struct point { int x; int y; }; 定義結構並聲明變量: struct point { int x; int

C語言結構和其他資料形式

1.結構變數 C語言中,提供了**結構變數(structure variable)**用於提高我們表示資料的能力,如果我們要列印一本書的圖書目錄,其中包含書名作者等等資訊,這樣我們需要這種資料形式既能包含字串,又能包含數字,而且各資訊獨立,此時我們就可以使用結構變數來儲存資料。 1.

C語言(三 字串結構共用輸入輸出)

字串 字串是儲存了一些字元,最後以null(’/0’)結尾的一維字元陣列。 char str[6] = {'h','e','l','l','o','/0'}; char str[ ] = "hello" ; 還有一些字串操作函式: 1、strcpy(s1,s2) 複製s2到s1 2

C語言struct大小首地址與記憶體對齊—由結構成員地址得到結構首地址

被問到如下問題:給定一個結構體中某個變數地址,可否得到結構體變數的地址? 答案是可以,但是對不同的場合有不同的結果;這與微處理器平臺、編譯器的處理不可分割。 首先,對於處理器,大尾端、小尾端的因素必須考慮; 其次: 一、 ANSIC標準中並沒有規定,相鄰宣告的變數在記憶體中一定要相鄰。 為了程式的高效性,

C語言_指標陣列結構動態記憶體分配

1、sizeof() int main() { int a[20]; int count=sizeof(a)/sizeof(int); printf(“%d\n”,count); return 0; } 2、指標陣列

C語言高階篇 - 6.陣列&字串&結構&共用&列舉

1.程式中記憶體從哪裡來1 1.1、程式執行需要記憶體支援 ()對程式來說,記憶體就是程式的立足之地(程式是被放在記憶體中執行的);程式執行時需要記憶體來儲存一些臨時變數。 1.2、記憶體管理最終是由作業系統完成的 (1)記憶體本身在物理上是一個硬體器件,由硬體系統提供。 (2)

C++列舉結構共用

一、列舉 enum typename {識別符號[=整型常數],...}; 作用:自定義值域;增加程式碼可讀性 從語法角度看,列舉元素是命名常量,列舉元素沒有賦初值的話實際值為0,1...沒有指定值的列舉元素,其值為前一元素加 1 從應用角度看,可以將列舉元素看作字面常量

C語言結構列舉型別型別定義)

結構體的定義 1、`struct 結構體名 { 成員型別 成員名; … }; 2、省略結構體名 struct { 成員型別 成員名; ... }結構體變數名; 成員可以是其他已定義結構體的型別,但不能是自己結構體的型別,可以是自己結構體的指標。 定義

C++ primer plus書--C++函式和C語言字串, 結構, string

函式和C風格字串 要將C風格字串作為引數傳遞給函式, 表示字串的方式有三種: 1.char陣列 2.用""擴起來的字串常量 3.被設定為字串地址的char指標 來看一個例子: // c風格字串例子 #include "iostream" using namespace std

C程式設計 | 結構共用和連結串列

一、定義和使用結構體變數 1、自己建立結構體型別 C語言允許使用者自己建立由不同型別資料組成的組合型的資料結構,它稱為結構體(structre)。 例如在程式中要用的如下圖所示的資料結構,可以在程式中自己建立一個結構體型別: struct Student

C結構共用列舉

一、結構體三種定義方式 1、先宣告結構體型別,再定義變數名 struct student { int num; char name[20]; char sex; int age; char addr[30]; } struct student student1

C 語言中的結構共用(聯合體)

本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,

C語言結構聯合,記憶體對齊規則總結

一、結構體 1.1什麼是結構體       在C語言中,結構體是一種資料結構,是C提供的聚合型別(C提供了兩種聚合型別:陣列和結構)的一種。結構體與陣列的區別是:陣列是相同型別的集合,而結構體可能具有不同的型別。 結構體也可以被宣告為變數,陣列或者指標等,用以實現較複雜的