#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;
}
上面用到的嵌套可以加以分析~~