IOS 階段學習第十天筆記(結構體),ios第十天
IOS學習(C語言)知識點整理
一、資料結構
1)概念:資料結構是指電腦程式中所操作的對象——資料以及資料元素之間的相互關係和運算。
2)結構體必須有struct 關鍵字修飾.
執行個體代碼:
1 struct Person{ 2 char name[20]; 3 int age; 4 float height; 5 }; 6 7 int main(){ 8 struct Person Tom={"Tom",22,180};//struct Person 是資料結構 9 //Tom 是變數名10 Tom.age=33;//通過點號訪問成員變數11 printf("姓名=%s;年齡=%d;身高=%.2f\n",Tom.name,Tom.age,Tom.height);12 return 0;13 }
3)使用typedef 修飾結構體,與不使用typedef修飾的結構體的區別在於,typedef修飾的結構體不需要再加struct即可使用。
執行個體代碼:
1 typedef struct Person{ 2 char name[20]; 3 int age; 4 float height; 5 }stPerson; 6 7 int main(){ 8 stPerson Jack={"Jack",36,178};//struct stPerson 是資料結構 9 //Jack 是變數名10 Jack.age=25;//通過點號訪問成員變數11 printf("姓名=%s;年齡=%d;身高=%.2f\n",Jack.name,Jack.age,Jack.height);12 return 0;13 }
4)結構體集合的使用
執行個體代碼:
1 int main(){ 2 //定義了一個數組,裡面可以放stPerson這種資料類型 3 stPerson stu[10]={}; 4 stPerson *pstu; 5 printf("%s",stu[0].name); 6 for (int i=0; i<10; i++) { 7 sprintf(stu[i].name, "Jack%d",i); 8 stu[i].age=10+i; 9 stu[i].height=170+i;10 }11 pstu=stu;12 //(*pstu).name等價於 pstu->name;13 //pstu+i 指向裡面的第i個元素14 //指標通過->去訪問指向的對象的成員變數15 int len=sizeof(stu)/sizeof(stPerson);16 for(int j=0; j<len; j++) {17 printf("姓名=%s;年齡=%d;身高=%.2f\n",(*pstu).name,(*pstu).age, (*pstu).height);18 pstu++;19 }20 return 0;21 }
5)結構體位元組對齊 #pragma pack(n) n可為1,2,4,8,16;設定系統對齊模數,按結構所有成員中最大者和對齊模數比較,與較小者對齊
執行個體代碼:
1 typedef struct 2 { 3 char ch[3];//單位元組對齊 4 }aa; 5 6 typedef struct 7 { 8 char ch[3]; 9 short b;//2位元組對齊10 }ab;11 12 typedef struct13 {14 char ch[3];15 short b;16 int c;//按照4位元組對齊17 }ac;18 19 typedef struct20 {21 char ch[3];22 short b;23 int c;24 long l;//按照8位元組對齊25 }ad;26 27 typedef struct28 {29 char ch;30 long l;31 }ae;32 33 int main()34 {35 printf("sizeof(aa)=%lu\n",sizeof(aa));//336 printf("sizeof(ab)=%lu\n",sizeof(ab));//637 printf("sizeof(ac)=%lu\n",sizeof(ac));//1238 printf("sizeof(ad)=%lu\n",sizeof(ad));//2439 printf("sizeof(ae)=%lu\n",sizeof(ae));//1640 return 0;41 }
6)枚舉 概念:一個被命名的整型常數的集合,枚舉聲明的關鍵字是 enum
注意點:
1、枚舉元素之間用 “,”分隔
2、枚舉第一元素如果沒有賦值預設值為0,之後的元素依次加1
3、枚舉是 unsigned int 類型的封裝集合。
4、枚舉都是常量,與宏#define相似
5、枚舉的名字不能重名
執行個體代碼:
1 enum weekday 2 { 3 Monday, 4 Tuesday, 5 Wednesday=10,//可以人為賦值,後面在此基礎+1 6 Thurday, 7 Friday=2,//後面的賦值可以比前面小 8 Saturday, 9 Sunday10 };11 12 int main()13 {14 enum weekday day= Saturday;//enum weekday 資料類型,day變數名15 printf("day=%u,sizeof(day)=%lu\n",day,sizeof(day));//結果:6,416 }
7)typedef 用法說明;typedef 老的類型 新的名字 ,給類型取個別名
執行個體代碼:
1 typedef unsigned long ul; 2 typedef int *intp; 3 int add(int a,int b){ 4 return a+b; 5 } 6 7 //給這種函數指標取了一個新名字 pfunc 8 typedef int (*pfunc)(int,int); 9 int main()10 {11 ul number= 100;12 int a = 20;13 intp p = &a;14 pfunc pf = add;15 printf("number=%lu\n",number);16 printf("*p=%d\n",*p);17 printf("add=%d\n",pf(10,20));18 return 0;19 }
8)結構聯合體,一般聯合體都是二選一,即聯合體中一般只會存在兩個元素,系統在初始化時只會選擇其中一個記憶體較大的進行賦值。
執行個體代碼:
1 typedef struct Person// Person可以省略,後面之用簡化的名字 2 { 3 char name[20];//成員變數 4 int age; 5 int height; 6 union{ 7 int stuid; 8 char workname[20]; 9 };//共用同一段記憶體,按情況去解析.10 //記憶體大小按大的計算11 //初始化的時候,按照第一個解析12 }stPerson;13 14 int main()15 {16 stPerson xiaoli={"xiaoli",18,180,97};17 stPerson xiaozhu={"xiaozhu",26,160,60};18 //初始化的時候,不能給最後一個成員變數賦值為字串19 printf("sizeof(stPerson)=%lu\n",sizeof(stPerson));20 printf("name:%s,age:%d,height:%d,stuid:%d\n",xiaoli.name,xiaoli.age,xiaoli.height,xiaoli.stuid);21 22 //給名字欄位賦值23 sprintf(xiaozhu.workname,"%s","qianfeng");24 printf("name:%s,age:%d,height:%d,workname:%s\n",xiaozhu.name,xiaozhu.age,xiaozhu.height,xiaozhu.workname);25 return 0;26 }