结构体、共用体及枚举型
10 结构体

}
程序运行结果如下:
Number:102
Name:Zhang ping
Sex:M
Age:20
Score:78.5
本例中,对结构体变量 boy1 作了初始化赋值,然后把 boy1 的值整体赋予 boy2,最后 用 printf 函数输出 boy2 各成员的值。
10.3 结构体数组
10.3.1 结构体数组的定义 结构体数组的每一个元素都具有相同的结构体类型。在实际应用中,经常用结构体数
10.4.1 指向结构体变量的指针 指向结构体变量或结构体数组的指针称为结构体指针变量(可简称为结构指针),其
值为所指向的结构体变量或结构体数组的首地址。 定义结构体指针变量的一般形式为: struct 结构体名 *结构体指针变量名 例如: struct stu boy,*pstu; 定义了结构体变量 boy 和结构体指针变量 pstu,通过赋值语句可使 pstu 指向 boy,即: pstu=&boy; /* boy 的地址赋给 pstu */ 注意: (1) 结构体指针变量与普通指针变量的性质一样,赋值前不能使用。 (2) 编译系统不给代表结构类型的结构体名分配空间,所以下面的用法是错误的。 pstu=&stu; 利用结构体指针可以访问结构体变量的各个成员,一般形式为: 结构体指针变量->成员名 其中,运算符“->”的优先级比较高,高于算术运算符、关系运算符、逻辑运算符等。
char sex;
int age;
float score;
}boy2,boy1={102,"Zhang ping",'M',20,78.5};
boy2=boy1;
printf("Number:%d\nName:%s\n",boy2.num,);
第10章 结构体、共用体、枚举类

1 声明一个结构体类型的一般形式为:struct 结构体名{成员表列};如:struct student{int num;char name[20];char sex;int age;float score;char addr[30];};2 定义结构体类型变量的方法(1)先声明结构体类型再定义变量名例如:struct student student1, student2;| | |结构体类型名结构体变量名(2)在声明类型的同时定义变量这种形式的定义的一般形式为:struct 结构体名{成员表列}变量名表列;(3)直接定义结构体类型变量其一般形式为:struct{成员表列}变量名表列;即不出现结构体名。
注意:成员名可以与程序中的变量名相同,二者不代表同一对象。
3 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
例如:scanf(″%d″,&student1.num);(输入student1.num的值)printf(″%o″,&student1);(输出student1的首地址)4 结构体数组的初始化struct student{int num;char name[20]; char sex;int age; float score; char addr[30];}stu[2]={{10101,″LiLin″,′M′,18,87.5,″103 BeijingRoad″},{10102,″Zhang Fun″,′M′,19,99,″130 Shanghai Road″}};5 指向结构体变量的指针#include <string.h>#include <stdio.h>void main(){struct student{long num;char name[20];char sex; float score;};struct student stu_1;struct student* p; p=&stu_1;stu_1.num=89101;strcpy(stu_,”LiLin”);stu_1.sex=‘M’;stu_1.score=89.5;printf(″No.:%ld\nname:%s\nsex:%c\nscore:%f\n″,stu-1.num,,stu-1.sex,stu-1.score);printf(″No.:%ld\nname:%s\nsex:%c\nscore:%f\n″,(*p).num,(*p).name,(*p).sex,(*p).score);}6 以下3种形式等价:结构体变量.成员名(*p).成员名p->成员名7 用指针处理链表(1)malloc函数(2) calloc函数(3) free函数其函数原型为void free(void *p);7.1 typedef struct{int n;struct{int y,m,d;}date;}PERSON;下面定义结构体数组并赋初值PERSON x[2]={1,04,10,1,2,04,12,30};PERSON x[2]={{1,04,10,1},{2,04,12,30}};PERSON x[2]={1,{04,10,1},2,{04,12,30}};7.2struct person{int id;char name[10];}per={1,"123456"};="123456"[0]='1'7.3struct sk{int n;float x;}date,*p;要使p指向date中的n域:p=(struct sk *)&date.n;8 共用体的概念使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构。
C语言数据结构-第9章 结构体共用体与枚举

"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];
实验9 结构体、共用体与枚举类型答案

率。 其次,结构体指针作为函数参数:可以在函数中通过该指针引用结 构体,当在函数中修改了结构体的成员变量后,指针所指向的结构体本 身也被改变了。而当结构体变量作为函数参数;在函数中可通过变量直 接使用结构体,但是,如果在函数中修改了结构体的成员变量后,结构 体本身并未发生变化,只是副本被改变。
} } average = s/5 ; printf("平均成绩:%.2f\n",average); }
4、5位职工的月收入如下表所示: 部门 月收入 工号 姓名 (char (float (int num) (char name) department) salary) 技术科 010002 张援朝 6800 生产科 020006 李明瑞 2600 检验科 030018 王国庆 4800 后勤部 040026 刘小兵 3700 经营科 050068 吴 伟 1900 试编程求这5位职工的平均月收入,并输出月收入小于3000元的职 工的部门、工号、姓名与月收入等信息。源程序以ex9_8.c命名,保存 在自己的文件夹内。
保存在自己的文件夹内。
解: #include <stdio.h> struct bookinfo { char isbn[20]; char title[50]; char author[20]; char publisher[50]; char pubdate[30]; float price; }book[5] = {{"7115177810","Java实用教程","李钟 尉","人民邮电出版社","2008年5月",32.00}, {"7113101015","汇编语言程序设计","白小明","中国铁 道出版社","2009年8月",35.00}, {"7302108535","C语言程序设计","谭浩强","清华大学 出版社","2005年7月",26.00}, {"7301123713","网络工程实用教程","汪新民","北京大 学出版社","2008年2月",34.00}, {"7111283812","软件工程概论","郑人杰","机械工业出 版社","2010年3月",28.00}}; main() { int i; float average, s=0; for(i=0; i<5; i++) { s += book[i].price; if(book[i].price<30.00) { printf("书号:%s ",book[i].isbn); printf("书名:%s ",book[i].title);
c语言中各种数据类型

c语言中各种数据类型C语言中的各种数据类型在C语言中,数据类型是非常重要的概念。
它定义了变量的类型及其在内存中所占据的空间大小。
C语言中有多种数据类型,包括基本数据类型和派生数据类型。
本文将依次介绍这些数据类型,并给出一些使用示例。
1. 基本数据类型1.1 整型(int)整型是C语言中最常用的数据类型之一。
它用于表示整数,包括正整数、负整数和零。
整型的大小取决于机器的架构,但通常情况下,int类型占用4个字节的内存空间。
下面是一个整型变量的声明和赋值的示例:```int num = 10;```1.2 浮点型(float和double)浮点型用于表示实数,包括小数和指数形式的数。
C语言中提供了两种浮点型:float和double。
float类型占用4个字节的内存空间,而double类型则占用8个字节的内存空间。
下面是一个浮点型变量的声明和赋值的示例:```float pi = 3.14;double e = 2.71828;```1.3 字符型(char)字符型用于表示单个字符,它占用1个字节的内存空间。
在C语言中,字符型变量使用单引号来表示。
下面是一个字符型变量的声明和赋值的示例:```char ch = 'A';```2. 派生数据类型2.1 数组(array)数组是一种派生数据类型,它可以存储多个相同类型的元素。
数组的大小在声明时指定,并且在程序运行期间不能改变。
下面是一个整型数组的声明和赋值的示例:```int nums[5] = {1, 2, 3, 4, 5};```2.2 结构体(struct)结构体是一种可以包含多个不同类型变量的数据类型。
它可以将不同类型的变量组合在一起,形成一个逻辑上的整体。
下面是一个结构体的声明和使用的示例:```struct Student {char name[20];int age;float score;};struct Student stu;strcpy(, "Alice");stu.age = 18;stu.score = 95.5;```2.3 枚举(enum)枚举是一种用户自定义的数据类型,它可以定义一组具有名称的常量。
C语言中的组合数据类型

C语言中的组合数据类型在C语言中,组合数据类型是一种非常重要的概念。
它允许我们将多个不同类型的数据组合在一起,形成一个新的数据类型,以方便我们对这些数据进行管理和操作。
本文将详细介绍C语言中的组合数据类型,并探讨其在实际应用中的作用和用法。
一、结构体(Structures)结构体是C语言中最基本的组合数据类型之一。
它允许我们将不同类型的数据按照一个特定的结构组织在一起。
结构体由多个成员变量组成,每个成员变量可以是任意类型的数据。
通过使用结构体,我们可以方便地描述和处理一些具有复杂结构的数据。
C语言中定义结构体的语法如下:```struct 结构体名 {类型成员变量1;类型成员变量2;类型成员变量3;...};```例如,我们可以定义一个表示学生信息的结构体:```struct Student {int id;char name[20];int age;float score;};```在上面的例子中,我们定义了一个名为Student的结构体,它有四个成员变量,分别表示学生的学号、姓名、年龄和成绩。
使用结构体时,我们可以通过结构体名加成员变量名的方式来访问和操作结构体的数据。
例如,要输出学生的姓名,可以使用以下代码:```struct Student stu;strcpy(, "John");printf("Name: %s\n", );```通过结构体,我们可以方便地对复杂的数据进行整体操作,并且可以自定义多个结构体,以满足不同的需求。
二、共用体(Unions)共用体是C语言中另一种重要的组合数据类型。
它允许在同一块内存空间中存储不同类型的数据,但同一时间只能存储其中一种类型的数据。
共用体帮助我们节省了内存空间,更加灵活地处理数据。
C语言中定义共用体的语法如下:```union 共用体名 {类型成员变量1;类型成员变量2;类型成员变量3;...};```例如,我们可以定义一个表示不同数据类型的共用体:```union Data {int i;float f;char str[20];};```在上面的例子中,我们定义了一个名为Data的共用体,它有三个成员变量,分别是整型变量i、浮点型变量f和字符数组str。
C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
C语言知识总结——宏,枚举,结构体,共用体

C语言知识总结——宏,枚举,结构体,共用体1、define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。
因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
define定义的常量,预处理时只是直接进行了替换,,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
,因此在编译时它不对宏的定义进行检查,作用域不影响对常量的访问。
它的常量值只能是字符串或数字。
该命令有两种格式:一种是简单的常量宏定义, 另一种是带参数的宏定义。
不带参数的宏:#define< 名字 >< 值 > 要注意,没有结尾的分号,因为不是C的语句,名字必须是一个单词,值可以是各种东西,宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
注意.宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
宏定义其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用#undef命令带参数的宏:像函数的宏,一般的定义形式:带参宏定义的一般形式为:「#define 宏名」(形参表)字符串,也是没有结尾的分号,可以带多个参数,#define NB(a,b)((a)>(b)?(b):(a)), 也可以组合(嵌套)使用其他宏,注意带参数宏的原则一切都要有括号,参数出现的每个地方都要有括号。
带参数的宏在大型的程序的代码中使用非常普遍,在#和##这两个运算符的帮助下可以很复杂,如“产生函数”,但是有些宏会被inline函数代替(C++的函数)使用宏好处:“提高运行效”。
定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体共用体枚举
目录
§1 结构体
§2 结构数组
§3 结构指针
§4 结构与函数
§5 共用体
§6 枚举
§7 用typedef定义类型
结构体的组成
wang20 F 10#222
Zhang 19 M 16#321
定义一个通讯录结构* * *
变量完全相同。
main ( ) { char str[20];struct date
{ int
year, month, day; } today; /*结构变量名*/ 举例分析
struct xs
{ unsigned xh;
char *xm;
char xb;
float sx;
} li1=
{1202,“Liming”,’m’,85.5}; main( ) {……}
对静态存储的结构体
变量初始化,其定义
可放
在函数体内
作为结
;
作为数组元素的
基
是一个数组,数组中的每一
都是结构类型。
说明结构数组的方法是:先定义一个结构,然后用结构类型说明一个数组变量。
举例分析为记录100个人的基本情况。
可以说明一个有100个元素的数组。
每个元素的基类型为一个结构,在说明数组时可以写成:
struct person man [ 100 ];
确定的列
体结构,
访问结构数组中
又要遵守
访问
例:struct xs
{ unsigned xh;...... };
struct xs xscj[3]={{…},{…},{…}};
或:struct xs
{ unsigned xh;......
} xscj[3]={{…},{…},{…
}};
二、结构体数组的初始化
课堂作业根据下面定义,能打印出字母M的语句是:
struct person{ char name[9]; int age; };
struct person class[10]={ “W a n g”, 17,
“Z h a n g”,19,
“M i n g”, 18,
结构指针:存放结构类型数据的首地址,该指针可以指§3 结构指针
§3结构指针
一、指向结构变量的指针
main( )
{ struct {"04",90,80}};struct xscj { char *xh;
课堂作业有以下定义语句,则值为6的表达式是:
struct s
{ int k1;
struct s *k2;
};
static struct s a[3]={ 5,&a[1] ,7,&a[2] , 9 ,’\0’}, *ptr; ptr=&a[0];
§4 结构与函数§4 结构与函数
结构在函数间的传递有
三种传递方式
1. 结构成员作为函数的参数传递
2. 结构整体作为函数的参数传递
3. 结构指针作为函数的参数传递
函数参数可以是:常数、变量、数组、指针、字符
也可以是:结构体(传送成批数据)
传递方法:虚实结合、返回值、全局变量
合
一、结构成员的传递
float x,y; main( )
{struct
int i;
总结。