第11章结构体及共用体
C语言第11章结构体
29
【例】30张选票,对三名侯选人之一投票选举,输 入得票人名字,按名字计数,输出最后选举结果。 #include "stdio.h" #define N 30 struct person { char name[20]; int count; };
Li
0 Zhang 0 Wang 0
led[0].name
第十一章 结构体与பைடு நூலகம்用体
本章目标
1.理解结构体,共用体的数据类型
2.学会定义结构体、共用体的数据类型 的变量 3.能够正确使用结构体、共用体的成员
§11.1
已了解的数据类型:
引言
整型 浮点型 字符型 数组
简单数据类型
用户定义的数据类型
特点:所有的元素都是同一种类型
指针型 存在的问题:难以处理较复杂的数据
18
圆点运算符
引用形式:结构体变量名 . 成员名 其中:成员运算符’ . ‟ : 一级,自左而右;
stu1.num 引用结构体变量stu1的num成员; 引用stu1的name成员(字符指针); [i] 引用name成员的第i个元素; stu1.birthday.y 只能对最低级成员进行引用;
二、定义完结构体后,定义结构变量并初始化 struct student x2={0002, "Li Ming ", 85.5};
16
§11.4 访问结构成员
访问结构变量实质上是引用其成员 有两种运算符可访问结构成员
17
struct date { int m; int d; iny y; }; struct student { long num; char name[20]; char sex; struct date birthday; float score; char tel[15]; } stu1, stu2;
第11章 结构体与共用休
定义结构体类型的同时定义结构体变量
一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
num
25B
name sex age num
name sex age
stu[0]
stu[1]
结构体数组初始化
分行初始化: 结构体数组引用 顺序初始化: struct student struct student 引用方式: 结构体数组名[下标].成员名 { int num; 例 { int student struct num; 例 struct num; char { char name[20]; int name[20]; stu[1].age++; struct student { char num; int sex; char sex; name[20]; int age; num; {char name[20]; int int age; char sex; }; char sex; }; int char name[20]; age; struct student stu[ ]={{100,“WangLin”,„M‟,20, int char sex; age; struct student stu[ ]={100,“Wang Lin”,„M‟,20}, }stu[ ]={{……},{……},{……}}; {101,“LiGang”,„M‟,19, int age; }stu[ ]={{……},{……},{……}}; 101,“Li Gang”,„M‟,19}, strcpy(stu[0].name,”ZhaoDa”); {110,“LiuYan”,„F‟,19}; }str[3]; 110,“Liu Yan”,„域
C语言程序设计 - 结构体和共用体-样本教案
用以下实例来分析:
struct
{int a;
int *s;
}*p;
第一组引用:对成员变量a的引用
++p->a++(p->a)
说明:成员变量a自增加1.
(++p)->a
说明:指针p先移动一个单位,然后引用对应的成员变量a.
注意: p每移动一个单位要移动多少字节?
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三:使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:
预处理命令与结构体练习题答案
第11章结构体与共用体一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。
)11.1 C语言结构体类型变量在程序运行期间A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元B)所有的成员一直驻留在内存中C)只有最开始的成员驻留在内存中D)部分成员驻留在内存中考生答案: 正确答案: B11.2 下列各数据类型不属于构造类型的是A)枚举型 B)共用型 C)结构型 D)数组型考生答案: 正确答案: A11.3 当说明一个结构体变量时系统分配给它的内存是A)各成员所需内存量的总和 B)结构中第一个成员所需内存量C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量考生答案: 正确答案: A11.4 设有以下说明语句typedef struct{ int n;char ch[8];} PER;则下面叙述中正确的是A)PER 是结构体变量名 B)PER是结构体类型名C)typedef struct 是结构体类型 D)struct 是结构体类型名考生答案: 正确答案: B11.5 已知有如下定义:struct a{char x; double y;}data,*t;,若有t=&data,则对data 中的成员的正确引用是A)(*t).data.x B)(*t).x C)t->data.x D)t.data.x 考生答案: 正确答案: B11.6 以下程序的运行结果是#include "stdio.h"main(){ struct date{ int year,month,day; } today;printf("%d\n",sizeof(struct date));}A)6 B)8 C)10 D)12考生答案: 正确答案: A11.7 设有如下定义:struck sk{ int a;float b;} data;int *p;若要使P指向data中的a域,正确的赋值语句是A)p=&a; B)p=data.a; C)p=&data.a; D)*p=data.a; 考生答案: 正确答案: C11.8 以下对结构体类型变量的定义中,不正确的是A)typedef struct aa{ int n;float m;} AA;AA tdl;B)#define AA struct aaAA { int n;float m;} tdl;C)struct{ int n;float m;} aa;struct aa tdl;D)struct{ int n;float m;} tdl;考生答案: 正确答案: C11.9 若有下面的说明和定义struct test{ int ml; char m2; float m3;union uu { char ul[5]; int u2[2];} ua;} myaa;则sizeof(struct test )的值是A)12 B)16 C)14 D)9考生答案: 正确答案: A11.10 以下程序的输出是struct st{ int x; int *y;} *p;int dt[4]={ 10,20,30,40};struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};main(){ p=aa;printf("%d\n",++(p->x));}A)10 B)11 C)51 D)60考生答案: 正确答案: C11.11 有以下程序:#include <stdio.h>union pw{ int i;char ch[2];}a;main(){ a.ch[0]=13;a.ch[1]=0;printf("%d\n",a.i);}程序的输出结果是A)13 B)14 C)208 D)209 考生答案: 正确答案: A11.12 已知学生记录描述为:struct student{ int no;char name[20],sex;struct{ int year,month,day;} birth;};struct student s;设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是A)year=1984;month=11;day=12;B)s.year=1984;s.month=11;s.day=12;C)birth.year=1984;birth.month=11;birth.day=12;D)s.birth.year=1984;s.birth.month=11;s.birth.day=12;考生答案: 正确答案: D11.13 有如下定义struct person{char name[9];int age;};struct person class[10]={"John",17,"paul",19,"Mary",18,"Adam",16,};根据上述定义,能输出字母M的语句是A)printf("%c\n",class[3].name);B)printf("%c\n",class[3].name[1]);C)printf("%c\n",class[2].name[1]);D)printf("%c\n",class[2].name[0]);考生答案: 正确答案: B11.14 下列程序的输出结果是struct abc{ int a, b, c, s; };main(){ struct abc s[2]={{1,2,3},{4,5,6}}; int t;t=s[0].a+s[1].b;printf("%d\n",t);}A)5 B)6 C)7 D)8考生答案: 正确答案: B11.15 若有下面的说明和定义,则sizeof(struct aa)的值是struct aa{ int r1; double r2; float r3;union uu{char u1[5];long u2[2];}ua;} mya;A)30 B)29 C)24 D)22考生答案: 正确答案: D11.16 有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。
c语言char11
方式二:可以在说明结构体时真接定义变量, 方式二:可以在说明结构体时真接定义变量,如: struct student{ int num; char name[20]; …} s1, s2, b[10], *p; 方式三:可在说明一个无名结构体类型时, 方式三:可在说明一个无名结构体类型时,同时直接定义变 。(此方式只可在不再需要定义此类型变量的场合下 量。(此方式只可在不再需要定义此类型变量的场合下 使用) 使用) struct { int num; char name[20]; …}s1, s2, b[10], *p;
name “ Li Lin”
sex ‘M’ year 1982
birthday month 12 day 4
score 85.5
a
二、对结构体变量的成员操作: 对结构体变量的成员操作:
结构体变量中的每个成员都属于某个具体的数据类型。因此, 结构体变量中的每个成员都属于某个具体的数据类型。因此, 对结构体变量中的每个成员的操作与普通变量一样, 对结构体变量中的每个成员的操作与普通变量一样,包括 输入输出。换句话说,如果某个成员是某基本类型, 输入输出。换句话说,如果某个成员是某基本类型,就可 以将该成员作为基本类型变量来处理。 以将该成员作为基本类型变量来处理。 例: scanf(“%ld %ld”,&a.num); /*长整型量输入 长整型量输入* scanf( %ld ,&a.num); /*长整型量输入*/ gets(); /*字符串输入 字符串输入* gets(); /*字符串输入*/ sex=ˊMˊ; /*字符变量赋值 字符变量赋值* a.sex=ˊMˊ; /*字符变量赋值*/ score=93 93. /*实型变量赋值 实型变量赋值* a.score=93.5; /*实型变量赋值*/ (i=0 name[i]!=ˊ\ for (i=0;[i]!=ˊ\0ˊ;i++) printf(“% ,a name[i]); ,a. /*输出字符值 输出字符值* printf( %c”,[i]); /*输出字符值*/ sum=sum+a.score;
十一章 结构体与共用体
结构体与共用体一、选择题:1.已知赋值语句wang.year=2004;则wang的变量类型是()A. 字符或文件B. 整型或实型C. 共用或结构D. 实型或指针2.Turbo C中,以下类型数据在存储器中占的字节数为 ( ) struct test{ int x;float y;char z;} ;A. 2B. 3C. 6D. 73.以下语句中,成员data的正确引用方式为( ) struct node{ int data;char name[10];}stree;struct node *p=&stree;A. p.dataB. p->dataC. (*p)->dataD. stree->data4、当执行以下程序段时,输出的结果是。
()struct data{ char a; int b; float c; };printf(“%d”, sizeof(struct data));A. 1B. 2C. 4D. 75.下面程序段的运行结果是。
struct stu{ int num; char name[10]; float scrose ; };printf(“%d\n”, sizeof (struct stu ));(A)14 (B)12 (C)16 (D)36. 若有定义:typedef char* string;#define str char *int a=4;struct {int x, *y;}z={10, &a}, *p=&z;则下列不等价的是:A. string name, sign; 与 str name, sign;B. *p->y++ 与 *(p->y++)C. ++*p->y 与 ++(*p->y)D. ++p->x与++(p->x) ()二、填空题:1.已知赋值语句zhang.year=1985;可判断zhang是类型的变量;2.若有类型定义:“typedef union{int a; char b; double c;} share;”及声明:“float r;”,则表达式:sizeof(r)+sizeof(share)的值是:。
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语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(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语言-结构体与共用体
(1)“结构类型名”和“数据项”的命名规则,与变量 名相同。 (2)数据类型相同的数据项,既可逐个、逐行分别定义, 也可合并成一行定义。 例如,上例中的日期结构类型,也可改为如下形式: struct date {int year, month, day; }; (3)结构类型中的数据项,既可以是基本数据类型,也 允许是另一个已经定义的结构类型。 例如,上例中的结构类型std_info,其数据项“birthday” 就是一个已经定义的日期结构类型date。 (4)本书将1个数据项称为结构类型的1个成员(或分 量)。
/*主函数main()*/ main() { int i; /* 打 印 表 头 : " □" 表 示 1 个 空 格 字 符 * / printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出三个学生的基本情况*/ for(i=0; i<3; i++) { printf("%-7s",student[i].no); printf("%-9s",student[i].name); printf("%-4s",student[i].sex); printf("%d-%d-%d\n",student[i].birthday.year, student[i].birthday.month, student[i].birthday.day); } }
11.2
定义结构体类型变量的方法
声明一个结构体类型的一般形式: struct 结构类型名 /* struct是结构类型关键字*/ {数据类型 数据项1; 数据类型 数据项2; …… …… 数据类型 数据项n; }; /* 此行分号不能少!*/
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、 填空(1) 为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。
Struct link{char data;;}node;(2) 以下程序的输出结果是 。
main(){struct cmplx{int x;int y;} cnum[2]={1,3,2,7};printf(“%d\n ”,cnum[0].y/cnum[0].x*cnum[1].x);}2、 选择(1) 根据以下定义,能输出字母M 的语句是A.printf(“%c\n ”,class[3].name);B.printf(“%c\n ”,class[3].name[1]);C.printf(“%c\n ”,class[2].name[1]);D.printf(“%c\n ”,class[2].name[0]); struct person { char name[9];int age;};struct person class[10]={ “John ”,17,“Paul ”,19,“Mary ”,18,“Adam ”,16,};(2) 对整个结构能够进行的操作是 。
A. 对结构进行赋值data nextB.对结构进行存取C.对结构进行运算D.对结构进行&操作(3)不是结构类型的特点的选项为。
A.结构体变量可以有不同类型的成员B.结构体中的成员都占有存储空间C.结构体变量既可以做函数参数,又可以从函数中返回D.结构体变量的成员既可以读又可以写3、判断(1)能在一个存储区内处理不同的类型的数据叫结构。
()(2)在编译时对结构类型不分配空间,只能对变量分配空间。
()(3)结构一旦定义,系统就给它分配所需的内存单元。
()4、程序设计(1)设有以下结构类型说明:struct stud{char num[5],name[10];int s[4];double ave;}请编写:<1>readrec把30名学生的学号、姓名、四项成绩及平均分放在一个结构体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算出平均分放在结构提对应的域中。
C语言程序设计 - 结构体和共用体-样本教案
1.用指针处理链表
指向结构体类型数据的指针;用指针处理链表
3.结构变量在函数中的应用
在C语言中,允许结构变量的成员,结构变量的整体和结构变量的地址做为实参传递给相应的形参。
(1)向函数传递结构变量的成员
结构变量的成员作实参
结构变量的成员可以是普通变量,数组或指针变量,它们做实参时的情况同以前七,八,九章所讲。
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
35个字节
35个字节
35个字节
指向结构类型的指针变量:
如:struct student *pstd;
系统为该指针变量分配一个存放"地址"的4个字节的内存空间,具体该指针变量指向哪个结构类型变量,通过为该指针变量赋予某结构变量地址值来确定.
如下例:
struct student *pstd1,*pstd2,*pstd3;
pstd1=&std;/*pstd1指向结构变量std的首地址*/
pstd2=pers;/*pstd2指向结构数组pers的首地址*/
pstd3=(struct student*)malloc(size of (struct student));
说明:结构变量名不是指向该结构的地址, 这与数组名的含义不同,
结构体与共用体
结构体与共用体
例如:20020945
有如下定义:struct sk
{int a;float b;} data;
int *p 则要使p指向data中的a域,正确的赋值语句是:C (A)p=&a;错误在于结构体变量的成员,必须通过定义的结构
体变量的名来引用其成员
(B)p=&data.a; data.a就是变量的值,而不是成员a地址
(C)p=&data.a;
(D)*p=data.a 同B解释
“()”优于“->”(指向)优于“++”
结构体类型还允许嵌套定义!
使用共用体类型数据时要注意:1,同一段程序可以用来存放几种不同的数据,但是在读写瞬间只能存放其中一种,而不是同时存放几种。
系统分配的空间为其中一个所需内存最大的成员的空间,不累加!!!
共用体变量的地址和他的各成员的地址都相同,即无论哪个成员起始地址都相同(参考19960946)。
typedef 原类型名新类型名
typedef v1 int v3
typedef 可以声明各种类型名,但是不能用用来定义变量。
他只为已存在的类型增加一个类型名,并不是创造新类型。
(参考20000930和20020947)。
结构体与共用体
一、结构体(structure)
C语言允许用户自己指定这样一种数据结构,即将不同类型的数据组合成一个有机的整体以便于引用。
二、共用体
使几个不同的变量共占同一段内存的结构。
三、枚举类型
1、如果一个变量只有几种可能的值,可以用此方法定义。
2、声明枚举类型用enum开头。
3、说明:(1)在C编译中,对枚举元素按常量处理;
(2)C语言编译按定义时的顺序使它们的值为0,1,2…,也可以改变枚举元素的值,在定义时由程序员指定;
(3)枚举值可以用来作判断比较;
(4)一个整数不能直接赋给一个枚举元素,只有进行强制类型转换才能赋值:workday=(enum weekday)2;
四、用typedef定义类型。
c语言第11章-结构体与共用体
}
§11.6 构造体和指针
ma指in向() 构造体变量旳指针
{ s❖tr定uc义t st形ud式en:t struct 构造体名 *构造体指针名; { 例lonsgtruicntt sntuudmen;t *p; char name[20]; ❖使str用ucch构tars造tsued体xe;n指t 针变存量储引构用造组体p员变形量式在内存旳起始地址
struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Roa
形式二:
struct 构造体名
{ 类型标识符 组员名; 类型标识符 组员名;
……………. }构造体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
❖用构造体变量旳组员作参数----值传递 ❖用指向构造体变量或数组旳指针作参数----地址传递 ❖用构造体变量作参数----多值传递,效率低
例 用构造体变量作函数参数
(main)
struct data { int a, b, c; };
accacbbb::::::::2332333370070
main()
}
指向构造体数组旳指针
例 指向构造体数组旳指针
struct student { int num;
char name[20]; char sex; int age;
p num
name
sex
p+1
age
c语言习题及参考答案
第1章C语言概述(一)选择题1.一个C程序的执行是从 A 。
答案AA) 本程序的main函数开始,到main函数结束B) 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束C) 本程序文件的第一个函数开始,到本程序main函数结束D) 本程序的main函数开始,到本程序文件的最后一个函数结束2.以下叙述不正确的是 D 。
A) 一个C源程序必须包含一个main函数B) 一个C源程序可由一个或多个函数组成C) C程序的基本组成单位是函数D) 在C程序中,注释说明只能位于一条语句的后面3.以下叙述正确的是 C 。
A) 在对一个C程序进行编译的过程中,可发现注释中的拼写错误B) 在C程序中,main函数必须位于程序的最前面C) C语言本身没有输入输出语句D) C程序的每行中只能写一条语句4.一个C语言程序是由 B 。
A)一个主程序和若干个子程序组成B) 函数组成C) 若干过程组成D) 若干子程序组成5. C语言程序编译时,程序中的注释部分______D______.A) 参加编译,并会出现在目标程序中B) 参加编译,但不会出现在目标程序中C) 不参加编译,但会出现在目标程序中D) 不参加编译,也不会出现在目标程序中(二)填空题1、C语句结束符为____;_____________.2、C语句注释符号为:_/* */______________.3、一个C程序总是从____main函数______________开始执行的。
第3章数据类型、运算符与表达式(一)选择题1. 若x、i、j、k都是int型变量,则计算下面表达式后,x的值为( C )。
x=(i=4,j=16,k=32)A) 4 B) 16 C) 32 D) 522.下列四组选项中,均不是C语言关键字的选项是( A )。
A) define IF typeB) getc char printfC) include case scanfD) while go pow3. 下列四组选项中,均是不合法的用户标识符的选项是( B )。
C语言共用体与枚举
C语言程序设计教程
第12章 共用体与枚举类型
8
(3) 共用体变量的地址和它的各个成员的地址相同。
(4) 不能企图引用共用体变量名来得到某成员的值。
(5) 共用体变量不能作函数参数,函数的返回值也不 能是共用体类型。 (6) 共用体类型和结构体类型可以相互嵌套,共用体 中成员可以为数组,甚至还可以定义共用体数组。
2013/11/22
C语言程序设计教程
第12章 共用体与枚举类型
21
12.4.3 位段结构
有时,存储1个信息不必占用1个字节,只需二进 制的1个或多个位就够用。如果仍然使用结构类型,则 造成内存空间的浪费。为此,C语言引入了位段类型。 1. 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有 成员均以二进制位为单位定义长度,并称成员为位段。 位段结构中位段的定义格式为: unsigned <成员名>:<二进制位数> 例如,CPU的状态寄存器,按位段类型定义如下:
2013/11/22
C语言程序设计教程
第12章 共用体与枚举类型
17
6.按位右移──>> (1)格式:x>>位数 (2)规则:使操作数的各位右移,移出的低位舍弃; 高位: 1)对无符号数和有符号中的正数,补0; 2)有符号数中的负数,取决于所使用的系统:补0 的称为“逻辑右移”,补1的称为“算术右移”。例如, 20 >> 2=5。
2013/11/22
C语言程序设计教程
第12章 共用体与枚举类型
15
0011 | 1001 1011=11 (3)主要用途:将1个数的某(些)位置1,其余各位 不变。
3.按位异或──^ (1)格式:x^y (2)规则:对应位相同时为0,不同时为1:3^9=10。 (3)主要用途:使1个数的某(些)位翻转(即原来为1的 位变为0,为0的变为1),其余各位不变。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3)用结构体变量和指向结构体的指针作函数参数
把结构传递给函数有三种方式: 单个成员 整个结构 指向结构的指针
1、成员传递:用结构变量成员作为实参(值传递)
例如:对于上面定义的结构变量stu_1有四个成员。 其中任何一个都可以做实参。
void main()
{……
{ prin(stu_1.num);
低一级的成员,对它进行赋值或存取以及运算. student1.birthday.month student1.birthday
3)成员可以像普通变量一样进行各种运算.
student2.score= student1.score;
2020/10/1s3tudent1.age++;
6
11.4 结构体变量的初始化
:
}}
2020/10/13
15
2、结构传递(全体传递,多值传递): 用结构变量作实参
将结构变量所占的内存单元内容全部顺序传递给形参(值 传递),由于采用值传递内存开销大、在被调函数中改变 的形参值不能返回主调用函数,因此在使用上很不方便。 eg11.5.c
3、传引用调用(地址传递): 定义结构指针变量并以此指针作为实参
例 paaa––r...upiicf}nn=不可==h;ti&11=fo能以f(;.‘nla“5ao用在例;%;d’a;一定atdt例f”例a个义;u{,}aan共共a.,iib=fuu{o){}ai用 用cfl,;n}n{nnolc=haoai1it,a体 体;ao1o*a,icftibri’nn;npt;l变 变hnao;ctx,fat’da;h量 量i;,rit;[1;;3cf时 为.(5]h;;c};另初编h(;a一始(d译)r*[个化cp(0通h)]变..;)ii过量fl(,o赋d*a[p值运t0)]f..c;行chh结(*果pd)[.不0f].对f ) a.i=1; a.ch=‘a’; a.f=1.5;
b=a; ()
x=a.f; ()
2020/10/13
19
– 结构体与共用体
• 区别: 存储方式不同 • 联系: 两者可相互嵌套
struct node
{ char ch[2];
ch
int k;
k
}a;
变量的各成员同时存在
a
union node { char ch[2];
int k; }b;
ch k
b
for(i=1;i<=5;i++)
{scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;}
printf("\n");
for(i=0;i<3;i++)
2020/10/13
{10101,"LiLin",'M',18,87.5,"123 Beijing"},
{10102,“zhangfun",'M',19,99,"123 Shanghai"},
{10104,“Wang Min",‘F',20,78.5,"123 Nanjing"}};
2020/10/13
9
10101
“li lin”
};// stu_1 ={89031,"Li Lin",'M',89.5};
struct student stu_1; struct student *p; p=&stu_1;
stu_1.num=89031;
strcpy(stu_,"Li Lin");
stu_1.sex='M'; stu_1.score=89.5;
➢在定义时初始化(eg11.1)
struct student {long int num; char name[20]; char sex;
a.num=89031; a.sex=‘M’; name如何赋初值?
char addr[20];
}aa=;{89031,"Li Lin",'M',"123 Beijing Road"};
{10104,"Wang Min",'F',20}};
void main()
{ struct student *p;
for(p=stu;p<stu+3;p++)
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);
}
2020/10/13
stu[0] stu[1] stu[2]
printf("NO.:%ld\nname:%s\nsex:%c\n,stu_1.sex,stu_1.score);
printf("NO.:%ld\nname:%s\nsex:%c\nscore:%f\n",
2020/10/13
13
(*p).num,(*p).name,(*p).sex,(*p).score);}
形式二: union data { int i; char ch; float f; }; union data a,b,c,*p,d[3];
形式三: union
{ int i; char ch; float f;
}a,b,c;
i ch
f
a
i ch
f
b
共用体变量任何时刻 共用体变量定义分配内存,
20只20/1有0/1一3 个成员存在
num name
birthday
addr
month day year
2020/10/13
5
11.3 结构体变量的引用
结构体变量不能整体引用,只能引用其成员
1) 结构体变量中成员的引用方式 结构体变量名.成员名 例如:student1.num = 10010;
student1.num (“.”是成员运算符,优先级最高) 2)如果成员本身又属一个结构体类型,则要找到最
– 共用体类型定义
定义形式:
例 union data { int i; char ch; float f; };
union 共用体名
{ 类型标识符 成员名; 类型标识符 成员名;
……………. };
i ch
f
类型定义不分配内存
2020/10/13
17
– 共用体变量的定义
形式一: union data { int i; char ch; float f; }a,b;
第十一章 结构体与共用体
构造的数据类型 • 结构体的定义 • 结构体的初始化 • 访问结构体成员 • 结构体和函数
2020/10/13
1
2、定义结构的同时定义结构变量: struct student {………
}studend1, student[2];(变量表列)
3、直接定义结构变量: struct {……… }studend1, student[2];
长度=最长成员所占字节数
18
– 共用体变量引用
• 引用方式:
共用体变量名.成员名 共用体指针名->成员名 (*共用体指针名).成员名
u• n引ion用d规ata则 –{不能in引t i;用共用体变量,只能引a.用i 其a成.ch员 a.f – 共用ch体ar变c量h;中起作用的成员是p-最>i后一p-次>c存h放p的->成f 员
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
10010 Li Gang M 18 87.5 Beijing
结构的定义:struct student
{int num; char name[20];
结构类型
char sex;
int age;
2020/10/13
float score;
struct student stu;
char addr[30];
};
3
➢ 结构体类型的形式:
struct 结构体名
{类型名1 成员名1;
关键 类型名2 成员名2;
字
:};
这个结构就是一种 数据类型
结构体类型许多种
11.2 定义结构体类型变量的方法
2020/10/13
4
成员可以是结构变量
struct date {int month; int day; int year; }; struct student {int num; char name[20]; struct date birthday; char addr[30] ; }student1,student2;
任一时刻只有一个成员存在
2020/10/13
20
例 结构体中嵌套共用体 eg11.12
struct { int num;
char name[10]; char sex; char job; union { int class;
char position[10]; }category; }person[2];