你的位置:首页 > 操作系统

[操作系统]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 }