基本概述: int double char; 定義一個學生類型 int Student 姓名 性別 年齡 簡單地說 結構體是一個可以包含不同類型的結構,他是一個自定義的類型。 struct 結構體標識符{成員變數;}; struct 是系統關鍵字,用來說明當前定義了一個自定義類型 結構體標識符 為了 ...
基本概述:
int double char;
定義一個學生類型 int Student 姓名 性別 年齡
簡單地說 結構體是一個可以包含不同類型的結構,他是一個自定義的類型。
struct 結構體標識符{成員變數;};
struct 是系統關鍵字,用來說明當前定義了一個自定義類型
結構體標識符 為了遵循c標識符命名規則的一個標識符
//struct 2B{}; 該種命名方式是不可以的
成員變數列表 用於描述此類事物的某一方面的特性 變數可以為基本數據類型和史震類型,也可以是
結構體的對齊補齊的存儲方式 為了方便CPU讀取
1.第一個數據成員存儲在第0個位置
2.之後的每一個成員存儲的起始位置是要從該成員大小的整數倍開始存放
3.結構體的總大小,必須是其內部最大成員(成員中大小最大的那個的整數倍)的整數倍,不足就要不齊。
結構體大小比實際定義的大小要大
位域:用來節約記憶體 存儲少量信息
案例測試代碼如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include<windows.h> 4 5 #pragma warning(disable:4996)//解決在vs2013中strcpy出錯,原因是strcpy安全性太低 vs棄用了 改成了strcpy_s 6 7 struct People 8 { 9 char name[20]; 10 char sex[5]; 11 int age; 12 }; //結構體的聲明 13 // .c是c語言文件 .cpp是c++文件 在c++中結構體使用的時候是可以省去struct 14 15 struct P 16 { 17 int a; 18 double b; 19 char c; 20 }pe,*ppe; 21 //typedef 用來給數據類型起別名 22 //pe --->struct p 23 //*ppe ----->struct p* 24 25 //typedef int[5] INT_ARR_5; //定義一個數組的別名 該種定義的方式是錯誤的 26 //typedef int INT_ARR_5[5];//要這樣定義 27 28 typedef int INT_ARR_5 [2]; 29 typedef int(*p)(int, int); //函數指針的別名,名字就是p int(*)(int,int);是一個函數指針 30 typedef int(*pArr)[5]; 31 32 int MySwap(int a, int b) 33 { 34 printf("交換函數:\n"); 35 return 0; 36 } 37 38 struct LvLiYu //位域 為了節省記憶體空間 用多少給多少 39 { 40 int a : 1; //4位元組 32位 只拿了32位(包括符號位的)中的一位用來存儲a 二進位位 41 int b : 8;//8位 42 int c : 10;//10位 43 int d : 5;//5位 44 int e : 1;//1位 都是按位存儲 45 }; 46 47 48 int main() 49 { 50 #if 0 51 struct People PangQi; //定義了一個自定義的變數 PangQi 52 PangQi.age = 20; 53 //PangQi.name = pangqi; //該種描述的方式是錯誤的 原因是數組名是一個地址,所以用一個常量來等於一個地址是錯誤的 54 //所以要用字元串拷貝函數 55 strcpy_s(PangQi.sex, "女"); 56 strcpy_s(PangQi.name, "艾迪"); 57 printf("姓名:%s\t性別:%s\t年齡:%d\t\n", PangQi.name, PangQi.sex, PangQi.age); 58 #endif 59 60 #if 0 61 //該案例存在緩衝區殘留寫入的bug,在輸入年齡的時候如果字元過長會直接跳過第二個學生的姓名輸入 62 //解決方法 在數據輸入迴圈中加入一句清空緩存取得命令 fflush(stdin); 63 struct People Student[3]; 64 for (int i = 0; i < 3; i++) 65 { 66 printf("請輸入第%d個同學的姓名:",i+1); 67 scanf("%s", Student[i].name); 68 69 printf("請輸入第%d個同學的性別:", i + 1); 70 scanf("%s", Student[i].sex); 71 72 printf("請輸入第%d個同學的年齡:", i + 1); 73 scanf("%d", &Student[i].age); 74 75 fflush(stdin); //清空輸入流緩衝區 76 } 77 printf("姓名\t\t性別\t\t年齡\t\t\n"); 78 for (int i = 0; i < 3; i++) 79 { 80 printf("%s\t\t%s\t\t%d\n", Student[i].name,Student[i].sex,Student[i].age); 81 } 82 83 #endif 84 85 // printf("%d",sizeof(struct P));//結構體的對齊與補齊 86 87 //typedef int age; 88 // age age= 58;//別名 89 90 #if 0 91 INT_ARR_5 a; 92 for (int i = 0; i < 5; i++) 93 { 94 a[i] = i + 1; //這裡說明a是一個數組 應為我們在前面定義了提個int型的數組別名INT_ARR_5 95 } 96 int b;//這裡我們定義b是一個整型變數 並不是一個數組 97 b[0];//所以此處會顯示錯誤 98 #endif 99 100 #if 0 101 INT_ARR_5 a[3]; //這種形式就表示一個二維數組 等價於int a[3][5] 102 for (int i; i < 3; i++) 103 { 104 for (int j; j < 5; j++) 105 { 106 scanf("%d",&a[i][j]); 107 } 108 } 109 #endif 110 111 #if 0 112 p Yu; //定義函數指針的變數 113 Yu = MySwap; //函數指針的變數保存函數地址 114 Yu(1, 2); 115 #endif 116 117 #if 0 118 int Arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 119 pArr p; 120 p = Arr; //p 指向Arr[0] p+1指向Arr[1] 121 printf("%d", **(p + 1)); 122 #endif 123 124 #if 0 125 printf("%d\n", sizeof(struct LvLiYu)); 126 struct LvLiYu HongLiYu; 127 HongLiYu.a = 1; 128 printf("%d\n", HongLiYu.a); 129 #endif 130 131 getchar(); 132 return 0; 133 }
註:在代碼中的#if 1/0 #endif 是預編譯部分,可以用來當做註釋
2019-03-26 09:23:34