C语言编程(十)
2020-07-21 04:07
676 查看
好久没更新这个系列了,今天接着说C语言中的结构体部分吧!主要介绍结构体定义、结构体变量定义、结构体变量的初始化、结构体变量之间赋值、结构体数组、结构体指针、结构体嵌套、结构体位段对齐等等。
知识点1【结构体的定义形式】
知识点2【结构体变量的定义】
知识点3【结构体变量的初始化】
知识点4【结构体变量获取键盘输入】
运行结果:
知识点5【结构体变量间的赋值】
运行结果:
[code]struct stu tmp;交换俩个结构体变量 tmp = lucy; lucy = bob; bob = tmp;
知识点6【结构体数组】
//需求:定义一个结构体数组 有5个元素 获取键盘输入 求取平均年龄
[code]void test07() { struct stu arr[5]; memset(arr, 0,sizeof(arr)); int n = sizeof(arr)/sizeof(arr[0]); //获取键盘输入 printf("请输入%d个学生的信息num name age\n",n); int i=0; for ( i = 0; i < n; i++) { scanf("%d %s %d", &arr[i].num, arr[i].name, &arr[i].age); } //统计总年龄 int sum = 0; for ( i = 0; i < n; i++) { sum += arr[i].age; } printf("平均年龄为:%d\n",sum/n); //按年龄 排序 冒泡排 for (size_t i = 0; i < n-1; i++) { for (size_t j = 0; j < n-i-1; j++) { if(arr[j].age > arr[j+1].age)//交换 { struct stu tmp; tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1]=tmp; } } } printf("--------------\n"); for (i = 0; i < n; i++) { printf("num=%d, name=%s, age=%d\n", \ arr[i].num, arr[i].name, arr[i].age); } }
运行结果:
知识点7【typedef】typedef 给已有的类型 取个别名。
typedef 不能创造 新的类型。
案例:给数组取个别名
案例:给函数指针 取个别名
案例:给结构体取个别名
知识点8【结构体指针】
[code]typedef struct stu { int num; char name[32]; float score; }STU,*STU_P; //STU就是struct stu的类型 //STU_P就是struct stu *的类型 void test04() { STU lucy={100, "lucy", 99.9f}; //STU_P p=&lucy; STU *p = &lucy; printf("num = %d,name=%s,score=%f\n", lucy.num, lucy.name,lucy.score ); //*p = *&lucy=lucy printf("num = %d,name=%s,score=%f\n", (*p).num, (*p).name,(*p).score ); //直接通过p访问lucy成员 printf("num = %d,name=%s,score=%f\n", p->num, p->name, p->score ); //如果.或->左边 是变量 就用. 如果是地址就用-> printf("num = %d,name=%s,score=%f\n", (&lucy)->num, (&lucy)->name, (&lucy)->score ); }
运行结果:
案例:堆区申请结构体空间
知识点9【结构体指针作为函数的参数】
知识点10【函数内部操作外部数组】
[code]typedef struct stu { int num; char name[32]; float score; }STU,*STU_P; STU* getSTUArray(int n) { return (STU *)calloc(n,sizeof(STU)); } void myInputSTUArray(STU *arr, int n) { int i=0; for(;i < n; i++) { printf("请输入第%d个学生的信息:",i+1); //scanf("%d %s %f", &arr[i].num, arr[i].name, &arr[i].score ); scanf("%d %s %f", &(arr+i)->num, (arr+i)->name, &(arr+i)->score ); } return; } void myPrintSTUArray(STU *arr, int n) { int i=0; for(i = 0; i < n; i++) { printf("num=%d,name=%s,score=%f\n", (arr+i)->num, (arr+i)->name, (arr+i)->score ); } return; } void test07() { STU *arr = NULL; int n = 0; printf("请输入学生的个数:"); scanf("%d", &n); //根据学生的个数 从堆区申请结构体数组空间 arr = getSTUArray(n); //获取键盘输入 myInputSTUArray(arr, n); //遍历结构体数组 myPrintSTUArray(arr, n); //释放空间 if(arr != NULL) { free(arr); arr=NULL; } } int main(int argc, char const *argv[]) { test07(); return 0; }
运行结果:
知识点11【结构体对齐问题】
步骤:
1、确定分配单位:每一行应该分配的字节数,由结构体中最大的基本类型的大小决定。
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
3、收尾工作:结构体的总大小 == 分配单位的整数倍。
案例:
结构体嵌套结构体:
[code]typedef struct { int x; int y; }DATA3; typedef struct { int a; int b; DATA3 c;//结构体嵌套结构体 }DATA4; void test03() { //结构体嵌套结构体:访问到最底层 DATA4 data; data.a = 10; data.b = 20; data.c.x = 30; data.c.y = 40; printf("%d\n", data.c.y); }
运行结果:
结构体嵌套结构体 的对齐问题
步骤:
1、确定分配单位:每一行应该分配的字节数,由所有结构体中最大的基本类型的大小决定。
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
结构体成员的偏移量 = 被嵌套的结构体里面最大的基本类型的整数倍
结构体成员中成员偏移量 相对与 被嵌套的结构体
3、收尾工作:结构体的总大小 == 分配单位的整数倍。
结构体成员 的总大小 == 被嵌套的结构体里面最大的基本类型的整数倍
案例:
结构体对齐深思:
知识点11【强制类型对齐】
步骤:
1、确定分配单位:每一行应该分配的字节数,min(value, 默认分配单位)
2、确定每个成员的起始位置的偏移量 = 成员的基本类型的整数(0~n)倍
3、收尾工作:结构体的总大小 == 分配单位的整数倍。
知识点12【结构体位段】
位段的使用:
无意义位段:
另起一个储存单元
应用场景:
相关文章推荐
- 面向对象C语言(Objective-C)编程(二)
- C语言高效编程的几招
- C语言编程规范试题
- 对C语言编程标准以及声明的基本理解
- 用C语言如何编程实现从三个数组中各抽取几个数进行组合的问题?
- c语言编程实现字符串向整数的转换(剑指offer)
- Linux下的C语言编程——线程编程基本操作
- 1047. 编程团体赛(C语言实现)
- C语言ADT(抽象数据类型编程)
- C语言的Socket编程例子(TCP和UDP)
- [沙漏问题]C语言编程 新人第一篇
- C语言编程入门——数组(下)
- 【c】C语言编程技巧汇萃
- c语言socket编程指南
- 浅谈C语言嵌入式系统编程注意事项
- C语言编程时出现 “ld.exe窗口” 错误
- 02、老徐教你学C语言基础篇2——C语言摩拳擦掌齐上阵(环境篇)——Linux编程软件
- 在C语言编程中,负数也为真
- 五个好的C语言编程实践
- 网络socket编程指南(C语言)