在實際的編程程序中,我們往往還需要一組型別不同的資料,例如對于學生資訊登記表,姓名為字串,學號為整數,年齡為整數,所在的學習小組為字符,成績為小數,因為資料型別不同,顯然不能用一個陣列來存放,
在C語言中,可以使用結構體(Struct)來存放一組不同型別的資料,
結構體定義
struct 結構體名{ 結構體需要的變數; }
結構體是一種集合,它里面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員(Member),
簡單理解,結構體就是一種自定義的資料型別,可以認為它跟int char等資料型別完全一致,區別就在于結構體是基本資料機構的集合,是由創建者自定義的,創建者擁有絕對的自主權,
結構體的優勢就在于很方便地進行多資料管理,
示例
#include <stdio.h> #include <string.h> struct student{ char name[16]; int age; int grade; }; struct teacher{ char *name;//危險 int age; int level;//職稱 }; int main() { struct student ZhangSan; struct teacher WangEr; ZhangSan.age = 16; WangEr.age = 50; WangEr.name = "WangEr";//危險 strcpy(ZhangSan.name, "ZhangSan"); // ZhangSan.name = "ZhangSan";//不能編譯通過 return 0; }
C++中的結構體
在C語言中,結構體不能包含函式,在面向物件的程式設計中,物件具有狀態(屬性)和行為,狀態保存在成員變數中,行為通過成員方法(函式)來實作,C語言中的結構體只能描述一個物件的狀態,不能描述一個物件的行為,在C++中,考慮到C語言到C++語言過渡的連續性,對結構體進行了擴展,C++的結構體可以包含函式,這樣,C++的結構體也具有類的功能,與class不同的是,結構體包含的函式默認為public,而不是private,
函式引入
#include <stdio.h> #include <string.h> struct student{ char name[16]; int age; int grade; void say() { printf("I am %s\n", name); } }; struct teacher{ char *name;//危險 int age; int level;//職稱 }; int main() { struct student ZhangSan; struct teacher WangEr; strcpy(ZhangSan.name, "ZhangSan"); ZhangSan.say(); return 0; }
自動初始化結構體
沒有初始化
#include <stdio.h> #include <string.h> struct student{ char name[16]; int age; int grade; void say() { printf("I am %s\n", name); } }; struct teacher{ char *name;//危險 int age; int level;//職稱 void say() { printf("I am %s\n", name); } }; int main() { struct student ZhangSan; struct teacher WangEr; ZhangSan.say();//I am @@, 記憶體里面是什么就輸出什么 strcpy(ZhangSan.name, "ZhangSan"); ZhangSan.say();//I am ZhangSan return 0; }

初始化
#include <stdio.h> #include <string.h> struct student{ char name[16]; int age; int grade; student() { strcpy(name, "Student"); } void say() { printf("I am %s\n", name); } }; struct teacher{ char *name;//危險 int age; int level;//職稱 void say() { printf("I am %s\n", name); } }; int main() { struct student ZhangSan; struct teacher WangEr; ZhangSan.say(); strcpy(ZhangSan.name, "ZhangSan"); ZhangSan.say(); return 0; }

結構體大小與記憶體對齊
結構體sizeof的結果往往都比宣告的變數總長度要大,
-
資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以后每個資料成員存盤的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始存盤),
-
結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存盤,(struct a里存有struct b,b里有char,int,double等元素,那b應該從8的整數倍開始存盤,)
-
收尾作業:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊,
建議閱讀
-
C語言結構體(Struct)
-
C 結構體
-
結構體記憶體對齊
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87981.html
標籤:C++
上一篇:回圈優先級佇列
