第9章-结构体与共同体
结构体类型
结构体类型的定义
struct 结构体名 {成员说明表列 };
struct student {long number;char name[20];char sex; };
结构体变量的定义
先定义结构体类型,再定义其变量
struct 结构体名 {成员说明表列 }; struct 结构体名 结构体变量列表;
定义结构体类型的同时定义结构体变量
struct 结构体名 {成员说明表列 }变量名表列;
struct student {long number;char name[20];char sex; }stu2;
不出现结构体名,直接定义结构体变量
struct {成员说明表列 }变量名表列;
struct {long number;char name[20];char sex; }stu2;
结构体变量的初始化和引用
结构体数组
定义和引用
#include<stdio.h>
struct student
{long number;char name[20];int age;float math;
};
int main() {int i, num = 0;float sum = 0;struct student class[5] = {{10001,"Li ping",18,96},{10002,"Zhang ping",19,88},{10003,"He fang",18,79},{10004,"Cheng ling",17,69},{10005,"Wang ming",17,57}};for (i = 0; i < 5; i++) {sum += class[i].math;if (class[i].math < 90) {num++;}}printf("sum=%.2f\naverage=%.2f\nnum=%d\n", sum, sum / 5, num);return 0;
}
指向结构体的指针
指向结构体变量的指针
struct student {long number;char name[20];int age;float math; }; struct student stu1; struct student *p=&stu1;
访问:
(*p).name p->name
指向结构体数组成员的指针
struct student {long number;char name[20];int age;float math; }; struct student stu[20]; struct student *p=stu;
示例
#include<stdio.h> struct student1 {long number;char name[20];char sex;int age; }; struct student1 stu4 = { 10101,"Lixiao",'m',19 }; struct student1 stu[3] = { { 10102,"Liping",'m',18 } ,{10103,"Zhangping",'m',20},{10104,"Hefang",'f',22} }; int main() {int i;struct student1* p, * q;p = &stu4;printf(" number name sex age\n");printf(" %5d %-10s%2c%5d\n", (*p).number, p->name, (*p).sex, p->age);q = stu;for (i = 0; i < 3; i++) {printf(" %5d %-10s%2c%5d\n", (*q).number, q->name, (*q).sex, q->age);q++;}return 0; } /*number name sex age10101 Lixiao m 1910102 Liping m 1810103 Zhangping m 2010104 Hefang f 22 */
结构体与函数
结构体作函数参数
值传递方式的特点:
#include<stdio.h> struct date {int nian;int yue;int ri; }; int riqi(struct date a) {a.nian = 2018;a.yue = 5;a.ri = 22;return 0; } int main() {struct date b;b.nian = 2017;b.yue = 4;b.ri = 26;printf("调用前:%d %d %d\n", b.nian, b.yue, b.ri);riqi(b);printf("调用后:%d %d %d\n", b.nian, b.yue, b.ri);return 0; } /* 调用前:2017 4 26 调用后:2017 4 26--对形参a的成员的修改,不会影响到主调函数中实参b的成员的值。 */
地址传递方式的特点
#include<stdio.h> struct date {int nian;int yue;int ri; }; int riqi(struct date *p) {(*p).nian = 2018;(*p).yue = 5;(*p).ri = 22;return 0; } int main() {struct date b;b.nian = 2017;b.yue = 4;b.ri = 26;printf("调用前:%d %d %d\n", b.nian, b.yue, b.ri);riqi(&b);printf("调用后:%d %d %d\n", b.nian, b.yue, b.ri);return 0; } /* 调用前:2017 4 26 调用后:2018 5 22--对形参p所指的结构体成员的修改,会改变主调函数中实参b的成员的值。 */
结构体作函数返回值
#include<stdio.h> struct StoreLib {char name[12];int num;float price;float SumMoney; }; struct StoreLib Goods; float Total = 0; int list(struct StoreLib Goods) {Goods.SumMoney = Goods.num * Goods.price;Total = Total + Goods.SumMoney;printf("%-24s%d\t%.2f\t%.2f\n", Goods.name, Goods.num, Goods.price, Goods.SumMoney);return 0; } struct StoreLib InputInfo() {scanf("%s", Goods.name);scanf("%d%f", &Goods.num, &Goods.price);return Goods; }; int main() {struct StoreLib iGoods[5];int i;printf("请输入5种库存商品信息:商品名称 数量 单价\n");for (i = 0; i < 5; i++) {iGoods[i] = InputInfo();}printf("\n---------------------------------------------\n");printf("库存清单:\n");printf("商品名称\t\t数量\t单价\t小计\n");for (i = 0; i < 5; i++) {list(iGoods[i]);}printf("库存商品金额总计:%.2f\n",Total);return 0; } /* 请输入5种库存商品信息:商品名称 数量 单价 果汁 200 3 牛奶 100 3 苹果 120 5 面包 30 5.5 水 50 2--------------------------------------------- 库存清单: 商品名称 数量 单价 小计 果汁 200 3.00 600.00 牛奶 100 3.00 300.00 苹果 120 5.00 600.00 面包 30 5.50 165.00 水 50 2.00 100.00 库存商品金额总计:1765.00 */
共用体类型
共用体类型及其变量的定义
一般形式
union 共用体名 {成员表列 }; union data {double a;int i;char ch; };
先定义类型,再定义变量
union data {double a;int i;char ch; }; union data num1,num2;
定义类型同时定义变量
union data {double a;int i;char ch; } num1,num2;
不出现共用体名,直接定义变量
union {double a;int i;char ch; } num1,num2;
共用体变量的引用
#include<stdio.h> union student {long number;char c;int age; }; int main() {union student s1, s2;s1.number = 10001;s1.c = 'L';s1.age = 65;printf("共用体变量s1成员的值为:\n");printf(" s1.number=%d\n s1.c=%c\n s1.age=%d\n", s1.number, s1.c, s1.age);s1.c = 'W';s2 = s1;printf("共用体变量s2成员的值为:\n");printf(" s2 is %c\n", s2.c);return 0; } /* 共用体变量s1成员的值为:s1.number=65s1.c=As1.age=65 共用体变量s2成员的值为:s2 is W--每一瞬间存储单元中之只能存放一个值,所以每一瞬间只有一个成员起作用 --覆盖技术,一个新的值存入后原有的成员值就会失去作用,起作用的成员时最后一次存入的成员 --同一类型的共用体变量之间可以整体赋值,但由于共用一段内存,赋值的操作其实只发生在同一类型共用体变量的成员之间 --不能对共用体变量名赋值,也不能直接输入、输入共用体变量 */
枚举类型
#include<stdio.h> int main() {enum month{Jan = 1, Feb = 2, Mar, Apr, May}mon;int k;printf("please input a number(1~5):");scanf("%d", &k);mon = (enum month)k;/*强制类型转换*/switch (mon){case Jan:printf("This month is January.\n");break;case Feb:printf("This month is February.\n");break;case Mar:printf("This month is March.\n");break;case Apr:printf("This month is April.\n");break;case May:printf("This month is May.\n");break;default:printf("This month is error.\n");break;}return 0; } /* please input a number(1~5):4 This month is April. */
typedef类型
定义别名 typedef int INTEGER; typedef float REAL;
第9章-结构体与共同体相关推荐
- c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
<<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...
- c语言 结构体 ppt,第8章C语言的结构体和共同体.ppt
<第8章C语言的结构体和共同体.ppt>由会员分享,可在线阅读,更多相关<第8章C语言的结构体和共同体.ppt(41页珍藏版)>请在皮匠网上搜索. 1.1第八章结构体.共用体和 ...
- 共同体不是c语言中的一个数据类型,《c语言程序设计教学资料》第12章---构体和共同体.ppt...
<c语言程序设计教学资料>第12章---构体和共同体 向函数传递结构体 用结构体指针或结构体数组作为函数参数,向函数传递结构体的地址 按值调用 按地址调用 结构体变量作函数参数 实现按值调 ...
- C语言程序设计 细节总结(第9章 结构体共用体枚举)
第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...
- 结构体与共同体(联合体)的妙用
结构体与共同体(联合体)的妙用 学习过C语言后,大家都了解了结构体与共同体.两者之间的区别是: 共同体:使几个不同类型的变量共占一段内存(相互覆盖).所占内存长度是各最长的成员占的内存长度. 结构体: ...
- 第九章结构体变量实验报告
实验项目: 1.结构体变量的应用 2.结构体数组的应用 3.共用体的应用 4.结构体指针的应用 姓名:谢丽萍 实验地点:教学楼514教室 实验时间2019.6.26 一.本章要点 1.对结构体和共 ...
- 呵呵哒!手把手教你C语言结构体与共同体
1.声明一个结构体类型的一般形式为:struct 结构体名{成员表列}; (1)在声明类型的同时定义变量 struct student{int num;char name[20];char sex;i ...
- C语言结构体和共同体
文章目录 结构体 用typedef说明一个新类型 结构体类型数据的定义和成员的引用 概述 结构体的定义和使用 结构体数组 结构体排序 结构体赋值 结构体嵌套结构体 共用体(联合体) 结构体 用type ...
- 第九章 结构体与共用体
C程序设计实验报告 姓名:欧阳思健 实验地点: 514实验室 实验时间:2019年6月26日 实验项目: 9.3.1 结构体变量的应用 9.3.2 结构体数组的应用 9.3.3 共用体的应用 9.3. ...
最新文章
- 重磅:IBM 340亿美元收购红帽软件,开源生态或将迎来重大变化
- mysql temporary_MySQL中的两种临时表
- 三星下一代手机芯片由AI来设计,EDA行业老大提供技术
- 实践周java基础软件开发app之五子棋
- win10+ubuntu双系统下,ubuntu不能访问windows的磁盘分区
- linux安装tensorflow教程,Ubuntu 16.04 安装 TensorFlow(GPU支持)
- overfitting(过度拟合)的概念
- SpringBoot2.0 Actuator 监控参数说明
- 【转】.NET Core 可移植类库PCL Portable Class Library详解
- mysql 全文索引 权重_MySQL中的全文索引
- 登录后 可编辑页面 php,如何查找和编辑登录的php页面以及更改详细信息 - WordPress - srcmini...
- SpringMVC开发框架中使用@ResponseBody注解后返回的json字符串中文乱码问题
- Netflix 混沌工程手册 Part 3:实践方法
- jQuery原型方法first,last,eq,slice源码分析
- c性能大容量cket_5千左右预算,既轻薄(高颜值)又高性能的笔记本推荐(兼顾Pr剪辑、Ps修图、CAD制图、办公游戏)...
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
- JavaScript 学习中
- 【零基础深度学习教程第一课:深度学习基础】
- 科技爱好者周刊(第 219 期):如何防止帐号被黑
- java合法标识符有哪些_Java中的合法标识符