第8章 结构体、共用体和枚举类型

合集下载

C语言 第八章.用户自定义数据类型

C语言   第八章.用户自定义数据类型
printf("%c,%c\n",u2.c[0],u2.c[1]); }
u2占2个字节
例:以下程序输出结果是?
union example { struct { int x,y; e.b e.a e.in.x }in; e.in int a; e.in.y int b; }e; void main() { e.a=1;e.b=2; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d",e.in.x,e.in.y); }
内存低地址 01100001 00001010
字符变量c占1个字节
整型变量i占2个字节 单精度实型变量f占4个字节
u1.i=10;
例:以下程序输出结果是?
union u_type { char c[2]; u1
p
内存高地址 内存低地址 ‘a’ ‘b’ c1 c2 c[1] c[0] u1占2个字节 内存高地址 内存低地址 ‘A’ ‘B’ ‘a’ ‘b’ c1 c2 c[1] c[0]
{"0208103322","lisi",19,'M'},{"0208103323","lili",20,'F'}, {"0208103324","xulin",21,'M'}};
学号(number) 姓名(name) 年龄(age) 性别(sex)
stu[0] stu[1] stu[2] stu[3]
char name[8];
int age; char sex;
定义结构体类 sizeof(stu) 型的同时创建 =? 结构体数组

c语言中各种数据类型

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)枚举是一种用户自定义的数据类型,它可以定义一组具有名称的常量。

2016C语言习题全集及答案:第八单元结构体和共用体

2016C语言习题全集及答案:第八单元结构体和共用体

第八单元结构体和共用体一、选择题1、说明一个结构体变量时系统分配给它的内存是。

A. 各成员所需要内存量的总和B. 结构体中第一个成员所需内存量C. 成员中占内存量最大者所需的容量D. 结构中最后一个成员所需内存量2、 C 语言结构体类型变量在程序执行期间。

A. 所有成员一直驻留在内存中B. 只有一个成员驻留在内存中C. 部分成员驻留在在内存中D. 没有成员驻留在内存中3、设有以下说明语句struct stu { int a ; float b ; } stutype ;则下面的叙述不正确的是。

A. struct 是结构体类型的关键字B. struct stu 是用户定义的结构体类型C. stutype 是用户定义的结构体类型名D. a 和b 都是结构体成员名4、程序中有下面的说明和定义struct abc { int x;char y;}struct abc s1,s2;则会发生的情况是。

A. 编译出错B. 程序将顺利编译、连接、执行C. 能顺利通过编译、连接、但不能执行D. 能顺利通过编译、但连接出错5、有如下定义struct person { char name[9]; int age;};struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam",16};根据上述定义,能输出字母M 的语句是。

A. prinft(" %c\n",class[3].name);B. printf(" %c\n",class[3].name[1]);C. prinft(" %c\n",class[2].name[1]);D. printf(" %c\n",class[2].name[0]);6、下面程序的输出是。

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++的函数)使用宏好处:“提高运行效”。

定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。

C语言学习入门笔记之结构体与共用体

C语言学习入门笔记之结构体与共用体

结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。

在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。

定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。

上面的结构体声明中Student就是结构体名(结构体标记)。

2.花括号内是该结构体所包括的子项,称为结构体的成员。

“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。

对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。

例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。

例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。

C语言11结构体与共用体

C语言11结构体与共用体

struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)

结构体共用体与枚举课后习题

结构体共用体与枚举课后习题1.定义一结构体,成员项包括一个字符型、一个整型。

编程实现结构体变量成员项的输入、输出,并通过说明指针引用该变量。

#includevoidmain(){tructa{charb;intc;}d,某p;p=&d;printf(\输入:\\n\canf(\canf(\printf(\输出:\\n\printf(\printf(\}2.建立一结构体,其中包括学生的姓名、性别、年龄和一门课程的成绩。

建立的结构体数组通过输入存放全班(最多45人)学生信息,输出考分最高的同学的姓名、性别、年龄和课程的成绩。

#includevoidmain(){inti,b,n;floata;printf(\请输入班级的人数:\canf(\getchar();tructperon{charname[20];chare某[10];intyear;floatcore;}tu[45];for(i=0;igetchar();}for(b=0,a=tu[0].core,i=0;i3.已知一个班有45人,本学期有两门课程的成绩,求:说明:要求定义结构体,第一成员项为学生姓名,第二成员项为学号,另外两个成员项为两门课成绩,并要求分别用函数完成。

(本人注:由于人数太多,故改为4人)#include#defineN4tructperon{charname[20];longintnumber;floatcore 1;floatcore2;};voidhuru(tructperontu[N]){inti;for(i=0;ivoidzuigao(tructperontu[N]){intb,i;floata;for(b=0,a=tu[0].core1,i=0;ivoidpingjun(tructperontu[N]){inti;float1,2,p1,p2;for(1=0,2=0,i=0;ivoidpai某u(tructperontu[N]){inti,j;tructperont;for(i=0;ivoidmain(){tructperontu[N];huru(tu);printf(\zuigao(tu);pingj un(tu);pai某u(tu);}4.输入一字符串,用链表形式储存,每个结点的数据域存放一个字符,最后输出链表中的全部字符。

C语言程序设计(第4版)

该次修订在保持前三版的写作风格和特色的基础上,主要做了以下改进。
该教材的第1章和第7章由冯佳昕编写;第2章、第3章和第8章由秦玉平编写;第4章~第6章由马靖善编写; 附录由刘福德编写;各章的习题由秦玉平编写。根据由大连理工大学王秀坤担任主审。在该教材的编写过程中, 作者参考了有关C语言程序设计的书籍和资料。
2020年9月,该教材由清华大学出版社出版。
内容简介
《C语言程序设计(第4版)》共分为8章,详细介绍了C语言的基本语法规则和功能实现。其中,第1章为C语 言概述,介绍C语言的简单发展历史、基本特点、32个关键字和语句的分类以及上机操作指导。第2章为C语言的 基本语法规则,介绍数据类型、运算符、表达式和基本输入/输出函数。第3章为控制语句与预处理命令,介绍分 支语句、循环语句和编译预处理命令。第4章为数组,介绍一维数组与二维数组的定义和使用以及常用字符串操作。 第5章为函数,介绍函数的定义、调用、命令行参数的使用、全局变量和局部变量等。第6章为结构体、共用体和 枚举,介绍结构体、共用体和枚举类型、变量的定义和使用、链表的基本操作等。第7章为文件系统,介绍缓冲区 系统文件的常用处理方法。第8章为常见错误和程序调试,介绍初学者常犯错误和程序调试方法。
教材目录
参考资料:
教学资源
该教材有配套教材——《C语言程序设计(第4版)学习与实验指导》。 该教材还提供大纲、源程序、教学课件、习题及其解答、实验指导、教学站等辅助教学资源。
作者简介
马靖善:男,计算机专业硕士毕业,渤海大学信息科学与技术学院教授。一直从事计算机专业教学和科研工 作。
秦玉平:1965年生,男,博士,渤海大学工学院教授,主要从事机器学习和模式识别方面的研究。
感谢观看
C语言程序设计(第4版)

8章 c语言程序设计 结构体,共用体与枚举类型


当通过指针变量引用结构体成员时,若表达式中含有++,-等运算符时,应根据运算符优先级来确定表达式含义。例: ++ p-> score 相当于++( p-> score),结果使score加1。 (++ p)-> score 则再访问成员score之前,使p加1。 例:struct abc {char a[20]; int *pt; }p; pt是结构体类型中的成员,则表达式*p->pt引用的是pt所 指存储单元; *p->pt++是再引用了pt所指存储单元后,使 指针pt加1;( *p->pt)++使pt所指向的单元的值加1;而 *p ++ ->pt在访问了pt所指存储单元后,p加1。
例:struct std_info {char name[9]; char sex[3]; float score; struct date birthday; }stud,arr[5],*p; p=& stud; (1)若要引用结构体类型变量stud 中score成员项,可写成: stud. score p-> score *(p). score arr[1] .score /*通过结构体变量引用*/ /*通过指针变量引用*/ /*通过指针变量引用*/
2.将一个结构体变量作为一个整体赋给另一具有相同类型的 结构体变量 例:struct {char name[15]; int num; }stud1,stud2={“wangfang”,01}; 执行赋值语句: stud1=stud2; 则stud2中把每个成员的值依次赋给stud1中对应的同名成员。 C不允许把一个结构体变量作为一个整体进行输入和输出。 例: scanf(“%d”,& stud1); printf(“%d”,stud1);都是错误的 结构体变量有多个不同类型的数据项,必须逐个用相应的格 式像普通变量一样输入和输出。 scanf(“%s,%d”, stud1. name ,& stud1.num); 注意name[15]是数组,数组名本身就是地址。

四川大学《c语言程序设计》课件-第8章 结构体与共用体

男 1999
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct ex2
{ long int num; float s[3]; };
void myfun4 ( struct ex2 *p ) { int i; float k; struct ex2 *q; for ( q=p; q < p+5; q++ ) { scanf("%ld", &q->num); for( i=0; i<3; i++ ) { scanf("%f",&k); q->s[i]=k; } } }

在主函数中定义“struct ex1”类型 变量wang和“float”类型变量ave 。 struct ex1 wang ;
int main( )
{ float ave;
就像float、int 型一样使用。
}

计算平均成绩并通过变 量wang输出有关信息。
int
main( )
{ float ave; struct ex1 wang ; wang.num =1000101; wang.s1 =89.5; wang.s2=90; ave= (wang.s1+ wang.s2)/2; printf ("%10ld%8.1f%8.1f%8.1f\n", wang.num,wang.s1,wang.s2, ave);
struct ex2
{ long int num; float s[3]; };

结构体类型变量地址作实参 。
【例8.8】 结构体变量地址作实参的示例。
struct ex2
{ long int num; float s[3]; };

结构体类型数组名作实参。
【例8.9】结构体类型数组名作实参的示例。
}
a 1 num next
b 2 num next
c \0 3 num next
p
main( ) 1 2 3 { struct lst a, b, c, *p; p = p -> next; a.num = 1; a.next = &b; b.num = 2; b.next = &c; 能改为p++; ? c.num = 3; c.next = NULL; printf ("%4d", p -> num ); p = &a; printf ("%4d", p -> num ); p = p -> next; printf ("%4d", p -> num ); p = p -> next; } c a b 1 \0 3 2 num next num next num next p
声明可改为: struct student { char name[10]; struct { int y , m, d; } birthday; float s[3]; };
【例8.11】内嵌结构体类型为 本结构体类型的示例。 #include <stdio.h> struct lst { int num; struct lst * next ; }; 能指向 struct lst 类型变量
8.3
8.3.1 8.3.2 8.3.5
提高部分
P252
结构体的进一步讨论 链表 实例的部分程序
8.3.1 结构体的进一步讨论
P252
在一个结构体类型中可以含有另一个 结构体类型。
【例8.10】 内嵌结构体类型的示例。
struct date { int y,m,d; } ; struct student { char name[10]; struct date birthday; float s[3]; };
各学生平均分:86.2、67.7、64.2、81.0、91.5
8.2

结构体和函数调用
结构体类型变量的成员作实参。
【例】结构体类型变量的成员作实 参示例 。
struct ex2 { long int num; float s[3]; };
结构体类型变量作实参

【例8.7】 结构体变量作实参的示例。
num
stu[0] 1000101 stu[1] 1000102
s[0]
s[1]
s[2]
89.5 68.0
56.5 81.0
90.0 80.0
59.0 88.0
79.0 55.0
77.0 74.0
stu[2] 1000103
stu[3] 1000104
stu[4] 1000105
90.5
95.0
89.0
int
printf("学号:%ld\n", p->num); for ( i = 0; i < N; i++ ) 等价于(*p).num { sum=sum+ p->s[i]; printf("%8.1f", p->s[i]); } printf( "\n" ); ave= sum/N; printf("平均成绩:%.1f", ave);
}
结构体类型的概念 把不同类型的数据组合在一个类型之中, 作为一个整体进行处理。

要表示日期
struct date { int year, month, day; }; 结构体类型 要表示学生情况 struct student { char name[20], number[9]; float s1,s2,s3; };
}
wang p
num 1000101 s[0] 89.5
(*p)
s[1] 90.0 s[2] 79.0
结构体变量名 . 成员名 (*指针变量名) . 成员名 指针变量名 -> 成员名
【例8.3】设有5名学生,而且每位学 生基本情况都包括学号和多门课成 绩,计算各学生3门课平均成绩 。
#define N 3 struct ex2 { long int num; float s[N]; };
main( ) 1 { struct lst a, b, c, *p; a.num = 1; a.next = &b; b.num = 2; b.next = &c; c.num = 3; c.next = NULL; printf ("%4d", p -> num ); p = &a;
}
p
a 1 num next
}
int
num 12字节 wang 1000101 4字节 main( )
s1 89.5 4字节
s2 90.0 4字节
{ float ave; struct ex1 wang ; wang.num =1000101; wang.s1 =89.5; wang.s2=90; ave= (wang.s1+ wang.s2)/2; printf ("%10ld%8.1f%8.1f%8.1f\n", wang.num,wang.s1,wang.s2, ave);
具体要求:
调用mycreat函数,建立链表; 调用myinsert函数,插入一个结点;
调用mydelete函数,删除值为m的结点;
调用myprint函数,输出各结点。
(1)声明结构体类型: struct lst { int num; struct lst *next; }; typedef struct lst LST; 可用LST代替struct lst
for (i = 0; i <5; i++) { printf(" %10ld", stu[i].num); sum=0; 注此行的位置 for ( j = 0; j <N; j++ ) { printf(" %8.1f", stu[i].s[j]); sum = sum + stu[i].s[j]; } ave= sum/N; printf("%8.1f \n", ave); } }
第8章 用户建立的数据类型
8.1 结构体类型变量的定义和使用 8.2 结构体和函数调用 8.3 提高部分
【例8.1】 假设学生基本情况包括学号 和两门课成绩,编写程序计算某学生 两门课的平均成绩,并输出该学生的 有关信息 。
编程点拨
声明结构体类型。
struct ex1 { long int num; float s1; 等价于 float s1,s2; float s2; };
int
scanf(“%ld%f%f ", &wang.num, &wang.s1, &wang.s2); main( )
{ float ave; struct ex1 wang ; wang.num =1000101; wang.s1 =89.5; wang.s2=90; ave= (wang.s1+ wang.s2)/2; printf ("%10ld%8.1f%8.1f%8.1f\n", wang.num,wang.s1,wang.s2, ave);
【例8.2】假设学生基本情况包括 学号和多门课成绩,计算某学生 的平均成绩 。
#define N 3 struct ex2 { long int num; float s[N]; }; 要处理的成绩较多时
main( ) { struct ex2 wang, *p ; float ave, sum=0,x; int i; p=&wang; 等价于wang.num scanf ("%ld", &(*p).num); for ( i = 0; i < N; i++ ) { scanf ("%f",&x); (*p).s[i]=x; }
相关文档
最新文档