在實際的編程過程當中,咱們每每還須要一組類型不一樣的數據,例如對於學生信息登記表,姓名爲字符串,學號爲整數,年齡爲整數,所在的學習小組爲字符,成績爲小數,由於數據類型不一樣,顯然不能用一個數組來存放。html
編程
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++的結構體也具備類的功能,與class不一樣的是,結構體包含的函數默認爲public,而不是private。spa
#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的結果每每都比聲明的變量總長度要大。.net
數據成員對齊規則:結構(struct或聯合union)的數據成員,第一個數據成員放在offset爲0的地方,之後每一個數據成員存儲的起始位置要從該成員大小的整數倍開始(好比int在32位機爲4字節,則要從4的整數倍地址開始存儲)。設計
結構體做爲成員:若是一個結構裏有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始存儲。(struct a裏存有struct b,b裏有char,int,double等元素,那b應該從8的整數倍開始存儲。)code
收尾工做:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。htm