結構體類型
什麼是結構體
我們觀察現實世界的時候,可以發現很多的東西它都是由不同的部分組合起來的。比如手機由電池、屏幕、晶片等很多個部分組成。同時對於一個電池它又是由很多的其他東西組成。結構體就是把這些東西組合在一起,進行統一的訪問和管理。可以理解成是對現實世界的抽象結構體不僅可以記錄不同類型的數據,而且使得數據結構是「高內聚,低耦合」的,更利於程序的閱讀理解和移植,而且結構體的存儲方式可以提高CPU對內存的訪問速度。
定義結構體
struct 數據類型名{//結構體數據成員列表};示例
struct Student{char * name;char * gender;char * mail;int age;};聲明結構體變量
方式一
struct Student student;方式二
struct Student {char name[10];char * gender;char * mail;int age;} stu;方式三
struct {char * name;char * gender;char * mail;int age;} stu;//之後無法再繼續定義變量結構體變量的初始化
結構體定義時初始化
struct Student{char name[10];char *gender;char *mail;int age;} student = {"泱澈", "男", "2633218009@qq.com", 21};變量定義時初始化
struct Student stu;// 此時需要進行類型轉換stu = (struct Student){"泱澈","男","2633218009@qq.com",21};//部分初始化struct Student stu = {.name = "泱澈"};單個進行賦值
//對數組類型的數據不能直接賦值 例如 stu.name = "泱澈";strcpy(stu.name,"泱澈"); stu.age = 21; stu.gender = "男";結構體變量的使用
我們使用 變量.成員欄位 來使用結構體的數據成員
strcpy(stu.name,"泱澈"); stu.age = 21; stu.gender = "男"; stu.mail = "2633218009@qq.com"; printf("%s\n", stu.name); printf("%s\n", stu.gender); printf("%s\n", stu.mail); printf("%d\n", stu.age);結構體數組
語法定義
struct Student{char * name;}stu[5];使用上與單個結構體變量相同,在數組中需要加上在數組中的下標
使用示例
#include <stdio.h>#include<string.h>struct Student{char * name;};int main(){struct Student stu[2];stu[0] = (struct Student){"泱澈"};printf("%s\n", stu[0].name);return 0;}結構體指針
指向結構體類型的指針
使用示例
#include <stdio.h>#include<string.h>struct Student{char * name;};int main(){struct Student stu = {"泱澈"};struct Student * p;p = &stu;printf("%s\n", (* p).name);printf("%s\n", p->name);return 0;}結構體嵌套
一個結構體當中可以包含其他類型的結構體,當中自身當中不能包含相同類型的結構體,但是可以包含執行自身的指針
使用示例
#include <stdio.h>#include<string.h>struct gender{char * ch;};struct Student{char * name;struct Student * s;struct gender gen;};int main(){struct gender gen = {"男"};struct Student stu = {"泱澈",NULL};struct Student student = {"泱澈",&stu,gen};printf("%s\n", student.name);printf("%s\n", (student.s)->name);printf("%s\n", student.gen.ch);return 0;}結構體變量在作為參數傳遞的時候使用的是值傳遞
typedef struct 與 struct 的區別
typedef 關鍵字可以將一種數據類型添加一種別名,例如 typedef int Int;此時Int 等價於 int。在stuck中,我們定義的別名可以直接用於定義變量,等價於 struct 類型名。
使用示例
#include <stdio.h>#include<string.h>struct gender{char * ch;};typedef struct Student{char * name;struct Student * s;struct gender gen;} Stu;int main(){struct gender gen = {"男"};struct Student stu = {"泱澈",NULL};struct Student student = {"泱澈",&stu,gen};//使用新定義的類型名 定義指針變量 等價於 struct StudentStu * s = &student;printf("%s\n", (*s).name);printf("%s\n", ((*s).s)->name);printf("%s\n", (*s).gen.ch);return 0;}enum 枚舉
什麼是枚舉
枚舉就是將我們數據可能存在的結果有限個的羅列出來。比如一個人的性別不是男就是女。不會出現其他的值。這個時候我們就可以使用枚舉來代表
語法示例
#include <stdio.h>#include<string.h>enum Gender{MAN = 1, //不指定值則從 0開始WOMAN = 2 //不指定值則從上一個定義的值開始遞增,為 2};int main(){//定義枚舉變量enum Gender g;//枚舉變量只可能存在一種值g = WOMAN;printf("%d\n",g);return 0;}union 共用體
什麼是共用體
共用體內部可以定義N個變量,但是這個N個變量之間會相互影響。共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員
語法示例
#include <stdio.h>#include<string.h>union Data{int a;char b;short c;};int main(){union Data d ;d.a = 46;printf("%d\n",d.a);printf("%c\n",d.b);printf("%d\n",d.c);printf("-----\n");d.b = 'a';printf("%d\n",d.a);printf("%c\n",d.b);printf("%d\n",d.c);printf("-----\n");d.c = 47;printf("%d\n",d.a);printf("%c\n",d.b);printf("%d\n",d.c);return 0;}/* 運行結果: 46 . 46 ----- 97 a 97 ----- 47 / 47*/以上就是本期的全部內容了,非常感謝你能看到這裡,我們下期見!