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 struct 13 { 14 char ch[3]; 15 short b; 16 int c;//按照4字节对齐 17 }ac; 18 19 typedef struct 20 { 21 char ch[3]; 22 short b; 23 int c; 24 long l;//按照8字节对齐 25 }ad; 26 27 typedef struct 28 { 29 char ch; 30 long l; 31 }ae; 32 33 int main() 34 { 35 printf("sizeof(aa)=%lu\n",sizeof(aa));//3 36 printf("sizeof(ab)=%lu\n",sizeof(ab));//6 37 printf("sizeof(ac)=%lu\n",sizeof(ac));//12 38 printf("sizeof(ad)=%lu\n",sizeof(ad));//24 39 printf("sizeof(ae)=%lu\n",sizeof(ae));//16 40 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 Sunday 10 }; 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,4 16 }
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={"kingkong",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","kingkong"); 24 printf("name:%s,age:%d,height:%d,workname:%s\n",xiaozhu.name,xiaozhu.age,xiaozhu.height,xiaozhu.workname); 25 return 0; 26 }