C語言結構體學習總結
C語言中包含short、int、long、char、float、double這六中基本資料型別。當然還有構造型別、指標型別、和空型別。如圖所示:
今天,我們著重總結一下構造資料型別中的結構體 (關鍵字:struct,不能省略) 的相關知識。
1.什麼是結構體?
結構體是一種工具,用這個工具可以定義自己的資料型別。同時,從上圖可以看出結構體屬於構造資料型別。
2.結構體與陣列的比較
(1)都由多個元素組成
(2)各個元素在記憶體中的儲存空間是連續的
(3)陣列中各個元素的資料型別相同,而結構體中的各個元素的資料型別可以不相同
3.結構體的定義和使用
(1)一般形式
struct 結構體名 {
型別名1 成員名1; //成員型別可以是基本型別或構造型
型別名2 成員名2;
...
型別名n 成員名n;
}; //注意不要忘記此處的;
例如,我們要表示一個學生的個人基本資訊。如 姓名、性別、年齡、分數等基本資訊,我們則可以如下定義:
struct Student{
char name[10];
char sex;
int age;
float score;
};
(2)定義結構體型別的變數、指標變數和陣列
定義結構體型別變數有以下三種方法,本人比較喜歡第三種。
方法一:定義結構體型別時,同時定義該型別的變數
struct [Student] { /*[]表示結構體名是可選的*/
char name[10];
char sex;
int age;
float score;
}stu1,*ps,stu[5]; /*定義結構體型別的普通變數,指標變數和陣列*/
方法二:先定義結構體型別,再定義該型別的變數
struct Student { /*[]表示結構體名是可選的*/ char name[10]; char sex; int age; float score; }; struct Student stu1,*ps,stu[5]; /*定義結構體型別的普通變數,指標變數和陣列*/
方法三:用型別定義符typedef先給結構體型別名別名,再用別名定義變數
typedef struct [Student] {
char name[10];
char sex;
int age;
float score;
}Stu;
Stu stu1,*ps,stu[5]; /*用別名定義結構體型別的普通變數,指標變數和陣列*/
說明:
結構體型別與結構體變數概念不同。
1.型別:不分配記憶體;變數:分配記憶體;
2.型別:不能賦值、存取、運算;變數:可以;
3.結構體可以巢狀;
4.結構體成員名與程式中變數名可相同,不會混淆。
例如:
struct date{
int month;
int year;
};
struct student{
int num;
char name[20];
struct date birthday; /*結構體可巢狀*/
}Stu;
(3)給結構體變數賦初值
一般格式:結構體型別 結構體變數名 = {初始表值};
方法一:
struct [Student] {
char name[10];
char sex;
int age;
float score;
}stu[2]={{"ZhangSan",'F',22,90},{"Su",'M',20,85}};
方法二:
struct student{
char name[10];
int age;
float score[5],ave;
};
struct student Stu = {"ZhangSan",22,99,78,99,76,88};
注:ANSI C允許兩個相同結構的結構體變數直接賦值
struct student li,zhang = {"zhang",20,92,90,98,67,0};
li=zhang; //將zhang物件拷貝一份賦值給li
/*但 li = {"li",19,76,56,90,69,80};是非法的*/
(4)引用結構體變數中的成員
a.結構體變數名·成員名:stu1.name
b.結構體指標變數—>成員名:ps—>name
c.(*結構體指標變數).成員名:(*ps).name
d.結構體變數陣列名.成員名:stu[0].name
注:1.求結構體型別資料的位元組數
sizeof(變數名或型別名);
2.巢狀結構體中成員的引用
結構體巢狀時,逐級引用
struct student{
int num;
char name[20];
struct date{
int month;
int day;
int year;
}Birthday;
}stu1,stu2;
//給出生日期的年份賦值
stu1.Btrthday.year = 1999;
4.結構體指標變數的定義和引用
1.結構體指標變數的定義
定義形式:struct 結構體名 *結構體指標名;
struct student *p; //此時指標變數*p中存放的是----結構體變數在記憶體的起始地址
//例:
struct student{
int num;
char name[20];
char sex;
int age;
}Stu;
struct student *p = &Stu;
2.結構體指標變數的引用
使用結構體指標變數引用成員形式
(*結構體指標變數名).成員名 <=> 結構體指標變數名—>成員名 <=> 結構體變數名.成員名(<=>是等價符號哈,各位看官莫慌=_=!)
例:
int n;
int *p = &n;
*p = 10; <=> n = 10;
struct student{
long int num;
char name[20];
char sex;
float score;
}Stu1;
struct student *p = &Stu1;
Stu1.num = 10; <=> (*p).num = 101; <=>p —>num = 101;
5.用結構體型別和基本資料型別的定義變數的對比
注:感謝博主 I come,I conquer 的博文幫助,附上原文地址:https://www.cnblogs.com/JCSU/articles/1487302.html