11、C語言之結構體和共用體
一、結構體
結構體:是一種自定義的構造數據類型
用途:把不同類型的數據組合成一個整體。
結構體類型定義:
struct [結構體名]
{
類型識別符 成員名;
類型識別符 成員名;
……
};(記住分號不可少)
eg:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}stu1,str2;(stu1,stu2為結構體變量)
說明:
結構體類型與結構體變量概念不同
類型:不分配內存 變量:分配內存;
類型:不能賦值、存取、運算 變量:可以;
結構體變量中的成員可單獨使用,方法如普通變量;
結構體可嵌套;
eg:
struct date
{
int month;
int day;
int year;
};
struct student
{
int num;
char name[20];
struct date birthday;
}stu;
結構體成員名與程序中變量名可相同,兩者不代表同一個對象。
結構體變量的引用:
引用規則
結構體變量不能整體引用,只能引用變量成員
結構體變量名.成員名。
stu.age = 20;
結構體的正確用法:
1 #include<stdio.h> 2 void main() 3 { 4 struct student 5 { 6 int No; 7 float score;8 char name[20]; 9 }stu; 10 scanf("%d,%f,%s",&stu.No,&stu.score,&stu.name); 11 printf("%d,%2.2f,%s",stu.No,stu.score,stu.name); 12 }
結構體初始化的方式:
(1)struct 結構體名
{
類型標識符 成員名1;
類型標識符 成員名2;
};
struct 結構體名 結構體變量={初始化數據};
(2)struct 結構體名
{
類型標識符 成員名1;
類型標識符 成員名2;
}結構體變量={初始化數據};
結構體數組:
具有相同結構的結構體也可以組成數組
定義結構體數組:三種形式
(1)間接定義
struct student
{
int num;
char name[20];
int age;
char sex;
};
struct student stu[2];
指向結構體類型數據的指針
存放結構體首地址
結構體的運算按照C語言的地址運算原則進行,
例如,結構指針加1,將指向內存中下一個結構體
指向結構體變量的指針
定義形式: struct 結構體名 *結構體指針名;
struct student { int num; char name[20]; char sex; int age; }stu; struct student *p = &stu;
結構體變量指針的使用,以下三種形式時等價的:
stu.num = 101;
(*p).num=101;//括號不能少
p->num=101;
用法舉例:
1 #include<stdio.h> 2 #include<string.h> 3 void main() 4 { 5 struct student 6 { 7 long int num; 8 char name[20]; 9 char sex; 10 float score; 11 }stu_1,*p; 12 p=&stu_1; 13 stu_1.num = 89001; 14 strcpy(stu_1.name,"lilei"); 15 (*p).sex = ‘M‘; 16 p->score = 89.5; 17 printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,p->name,stu_1.sex,p->score); 18 }
二、共用體
共用體概念:
構造數據類型,也叫聯合體
用途:使幾個不同類型的變量共占一段內存(相互覆蓋)
類型定義形式:
union 共用體名
{
類型標識符 成員名;
類型標識符 成員名;
};
eg:
union data
{
int i;
char ch;
float f;
}a,b,*p,d[3];(與結構體類似)
說明:共同體變量任何時刻只有一個成員存在。共用體變量定義分配內存,長度=最長成員所占字節數
共用體變量的引用方式
三種方式等價:
共用體變量名.成員名
共用體指針名->成員名
(*共用體指針名).成員名
共用體類型數據的特點:
(1)同一個內存段可以用來存放幾種不同的成員,但在每一瞬間,只能存放其中一種,而不是同時存放幾種
(2)共用體變量中起作用的成員是最後一次存放的成員
(3)共用體變量和它的各成員的地址都是同一地址
三、枚舉類型
枚舉類型時ANSI C新標準所增加的。
如果一個變量只有幾種可能的值,可以定義為枚舉類型。所謂枚舉是指將變量的值一一列舉出來,變量的值只限於列舉出來的值的範圍內。
枚舉類型及其變量的定義形式:
enum 枚舉類型名 {枚舉元素列表} 枚舉變量列表;
可以先聲明類型再定義變量,或同時進行或直接定義變量。
eg:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
enum weekday workday,week_end;
或
enum weekday {sun,mon,tue,wed,thu,fri,sat} workday,week_end;
其中,sun,mon……sat等為枚舉元素或枚舉常量。它們時用戶定義的標識符。
說明:
在編譯時,對枚舉元素按常量處理,它們不是變量,不能對他們賦值。
枚舉元素作為常量,它們時有值的,語言編譯按定義時的順序使他們的值為0,1,2……
枚舉值可用用來做判斷比較:
eg:
if(workday == mon)……
if(workday >sun)……
一個整數不能直接賦給一個枚舉變量,應該先進行強制類型轉換才能賦值。
eg:workday = (enum weekday)2;
四、用typedef定義類型
功能:用自定義名字為已有數據類型命名
類型定義簡單形式:typedef type name;
type:已有數據類型
name:給type定義的別名
說明:
1、typedef沒有創造新數據類型
2、typedef時定義類型,不能定義變量
3、typedef與define不同
typedef定義類型步驟:
1、按定義變量方法寫出定義體 如 int i;
2、將變量名換成新類型名 int INTERGER;
3、最前面加typedef 如typedef int INTERGER
4、用新類型名定義變量 如 INTERGER i,j;
類型定義可以嵌套
11、C語言之結構體和共用體