8_1 結構體的概念和結構體變量node
_1.1 結構體的概念數組
C語言中容許用戶本身構造由不一樣數據類型的數據所組成的集合體,稱爲結構體。結構體屬於數據類型,每個結構體有一個名字,稱爲結構體名。一個結構體由若干成員(也稱域)組成,每一個成員的數據類型能夠相同,也可不一樣。函數
_1.2 結構體類型的定義指針
struct <結構體類型名>code
{ 內存
類型標識符 成員名1;get
類型標識符 成員名2;string
……it
};io
例:
struct student { char number[10]; char name[20]; char sex; int age; float score1; float score2; };
注:末尾的「;」切記不丟失。
_1.3 結構體類型變量的定義
(1) 先定義結構體類型,再定義結構變量
struct student { char number[10]; char name[20]; char sex; int age; float score1; float score2; }; struct student s1, s2; /*定義student類型的結構體類型變量s1, s2*/
特色:能夠將結構體類型的定義放到一個文件中(通常爲.h頭文件),如:#include<struct.h>
(2) 在定義結構類型的同時定義結構變量。
struct student { char number[10]; char name[20]; char sex; int age; float score1; float score2; }s1, s2;
(3)不定義結構類型,直接定義結構變量。
struct { char number[10]; char name[20]; char sex; int age; float score1; float score2; }s1, s2;
嵌套定義:
struct date { int month; int day; int year; }; struct employee { char name[10]; char sex[3]; int age; struct date birthday; char address[30]; char tel[12]; }employee;
_1.4 結構體變量的引用
引用結構體成員方法以下:
結構體變量名.成員名
【例】:
s1.age=18; gets(s1.name);
_1.5 結構體變量的初始化
struct student { char number[10]; char name[20]; char sex; int age; float score1; float score2; }; struct student s1,s2={"1002","WangHua","M",19,86,89 };
【例8-1】分析如下代碼
#include<stdio.h> struct curriculum { char name[30]; float credit; float grade; }; struct student { char id[8]; char name[20]; struct curriculum course; }s1={"1003","LiHong","C",4,87}; int main() { struct student s2; printf("請輸入s2的信息:\n"); printf("學號\t 姓名\t 課程名\t 學分\t 成績\n"); scanf("%s\t%s\t%s\t%f\t%f",s2.id,s2.name,s2.course.name,&s2.course.credit,&s2.course.grade); printf("\n兩名學生的信息以下:\n\n學號\t姓名\t課程名\t學分\t成績\n"); printf("%s\t%s\ t%s\t%.lf\t.2f\n",s1.name,s1.course.name,s1.course.credit,s1.course.grade); printf("%s\t%s\t%s\t%.lf\t.2f\n",s2.name,s2.course.name,s2.course.credit,s2.course.grade); return 0; }
8.2 結構體數組
_2.1 結構體數組的定義
struct student { char number[10]; char name[20]; char sex; int age; float score1; float score2; }; struct student stu[50]; /*定義數組stu*/
_2.2 結構體的初始化
(1)在定義的時候賦初值
(2)定義完成後,用循環語句賦初值
_2.3 結構體數組舉例
【8-2】 對候選人得票的統計程序
設有候選人3名,N名選民參加投票,選民投票輸入候選人的姓名。投票結束後,輸入候選人得票結果。
#include<stdio.h> #include<string.h> #define N 5 struct condidate { char name[10]; int count; }person[3]={{"LiMing",0},{"WangFeng",0}}; int main() { int i,j,invalid=0; char name[10]; for (i=1;i<=N;i++) { printf("請輸入候選人姓名:"); gets(name); for(j=0;j<3;j++) if (strcmp(name,person[j].name)==0) { person[j].count++; break; } if (j==3) invalid++; } printf("\n投票人數%d票,有效票%d票,無效票%d票。\n",N,N-invalid,invalid); printf("得票狀況:\n"); for(i=0;i<3;i++) printf("%10s:%d票\n",person[i].name,person[i].count); return 0; }
8_3 結構體指針
_3.1 結構體指針與指向結構體變量的指針變量的概念
形式:struct 結構體名 *指針變量名 如:
struct student *p;
_3.2 用指向結構體變量的指針變量引用結構體變量的成員
【例8-3】分析如下代碼及輸出結果。
#include<stdio.h> #include<string.h> struct student { char number[10]; char name[20]; float score1; float score2; }; void output (struct student x) { printf("number\tname\tscore1\tscore2\n"); printf("%s\t%s\t%.2f\t%.2f\n",x.number,x.name ,x.score1 ,x.score2); } int main() { struct student s1={"1001","ZhaoMin",70,65}; struct student *p=&s1; printf("初始信息以下:\n"); output (*p); p->score1 =80.5; p->score2 =95; printf("\n修改後信息以下:\n"); output (s1); return 0; }
_3.3 用指向結構體變量的指針變量引用結構數組元素
【例8-4】分析如下代碼及輸出結果
_3.4 用指向結構體變量的指針變量做爲函數參數
(1)結構體指針變量只能指向該結構體類型的變量,而不能指向結構體類型變量的成員。
(2)結構體數組名做函數實參是「地址傳遞」方式的函數調用。
(3)結構體變量做函數實參是「值傳遞」方式的函數調用。
(4)結構體指針變量做函數實參是「值傳遞」方式的函數調用,只不過傳遞的是一個地址值。
(5)注意理解和區別運算符「.」和「->」。「.」是成員運算符,它的左邊應爲結構體變量,而「->」是指向成員運算符,它的左邊應爲結構體指針。如:「p->score1」「*p.score1」以及「s1.score」三者是等價的。
_3.5 用指向結構體變量的指針變量處理鏈表
1. 鏈表的基本結構
鏈表中每個節點的數據類型都是一個自引用結構體類型(同一類型的數據)。如:
struct node { char Tel[20]; char Tel[12]; struct node *next ; };
2. 鏈表的基本操做
創建鏈表,鏈表的輸出,在鏈表中插入、刪除、查找或統計節點等。
8.4 枚舉類型和共用體類型簡介
_4.1 枚舉類型
1. 枚舉類型的定義
定義形式:enum 枚舉類型名 { 枚舉表;};
(1)定義枚舉類型時,「枚舉表」中每一個枚舉常量的名稱必須是惟一的。
(2)枚舉類型是用標識符表示的整型常量的集合,枚舉常量是自動設置值的符號常量,起始值爲0;如:
enum months {JAN ,FEB ,MAR ,APR ,MAY ,JUN ,JUL ,AUG ,SEP ,OCT ,NOV ,DEC};
其中,各枚舉常量的值被依次自動設置爲整數0~11。
(3)也能夠採用在定義時指定常量初值,如:
enum months {JAN=1 ,FAB ,MAR ,APR ,MAY ,JUN ,AUG ,SEP ,OCT ,NOV ,DEC };
後面的值會自動自增,也能夠在中間或其餘位置指定不一樣的值。
(4)完成定義後,其值就不可更改了,但能夠做爲整型常量使用。
2. 枚舉類型變量的定義
形式:enum 枚舉類型名 枚舉變量名列表;如:
enum weekday{sun,mon,tue,wed,thu,fri,sat}; enum weekday week;
另:與結構體相似,能夠在定義枚舉類型時定義枚舉變量,如:
enum weekday{sun,mon,tue,wed,thu,fri,sat}week;
也能夠不聲明枚舉類型的名稱,而直接定義該類型的枚舉變量。如:
enum {sun,mon,tue,wed,thu,fri,sat}week;
3. 枚舉變量的引用
【例8-16】分析如下代碼及運行結果。
#include<stdio.h> int main() { enum weekday {SUM,MON,TUE,WED,THU,FRL,SAT}; enum weekday date1,date2,date3; date1=SAT; date2=WED; date3=SUM; printf("date1=%d,date2=%d,date=%d\n",date1,date2,date3); return 0; }
_4.2 共用體類型
1 .共用體類型的定義:
union<共用體名>
{成員表列};
2. 共用體變量的定義
與結構體類型的定義類似;如:
(1)先定義共用體類型,再定義變量。
union data { float v; Short int n; char c; }; union data u1,u2;
(2)二者同時定義,如:
union data { float v; Short int n; char c; }u1,u2;
(3)同時定義,省去共用體名,如:
union { float v; Short int n; char c; }u1,u2;
注:該方法定義的共用體類型不能再用來定義另外的共用體類型變量。
3. 共用體變量的引用以及共用體類型數據的特色
只能逐個引用共用體變量的成員。
格式爲:u1.v , u2 .n , u1.c
(1)系統採用覆蓋技術,實現內存共享,因此在某一時刻存放的、起做用的是最後一次存入的成員值。
(2)共用體變量與其餘各成員的地址相同。
【例8-8】分析如下代碼及運行結果。
#include<stdio.h> union u { char u1; short u2; }; int main() { union u a={0x9741}; printf("1.%c %x\n",a.u1,a.u2); a.u1 ='a'; printf("2.%c %x\n",a.u1,a.u2); return 0; }