第十一章结构体和共用体

合集下载

C语言第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;

C语言程序设计-第11章 结构体与共用体

C语言程序设计-第11章 结构体与共用体

2.说明: (1)结构体类型与结构体变量是两个不同的概念, 其区别如同int类型与int型变量的区别一样。 (2)结构体类型中的成员名,可以与程序中的变 量同名,它们代表不同的对象,互不干扰。 (3)“结构体类型名”和“数据项”的命名规则, 与变量名相同。
(4)数据类型相同的数据项,既可逐个、 逐行分别定义,也可合并成一行定义。 例如,本案例中的日期结构类型,也可改为如下形 式: struct date {int year, month, day; }; (5)结构体类型中的数据项,既可以是基本数据类 型,也允许是另一个已经定义的结构体类型。 例如,结构体类型std_info,其数据项“birthday” 就是一个已经定义的日期结构类型date。 (6)本书将1个数据项称为结构体类型的1个成员 (或分量)。
例如:
struct student {int num; . . . }; struct student stu[ ]={{…},{…},{…}}; 以上即声明结构体类型,然后定义数组为该结构体类 型,在定义数组时初始化。
11.5.3 结构体数组应用举例
例 11.2 对候选人得票的统计程序。 #include <string.h> struct piao {char name[20]; int count; }leader[3]={“Li”,0,”Zhang”,0,”Fun”,0}; main() {int i,j; char leader_name[20]; for(i=1;i<=6;i++) {scanf(“%s”,leader_name);
C语言提供了将不同类型的数据组合成一个 有机的整体,以便引用。例如,一个学生 的学 号、姓名、性别、年龄、成绩、家庭 地址等项。这些项都与该学生相联系。 在一个组合项中包含有若干个类型不同的数 据项,这样一种数据结构称为结构体。它相 当于其他高级语言中的“记录”。 见下图: num name sex age score addr 10010 Li Fun M 18 87.5 Beijing

第11章 结构体与共用体

第11章  结构体与共用体

struct
{
{
{
unsigned int No;
unsigned int No;
unsigned int No;
char name[32];
char name[32];
char name[32];
unsigned short age;
unsigned short age; unsigned short age;
stu1.score = 20.0; sizeof(struct student)
} stu1, stu2;
}
106
2. 定义结构体类型变量的方法
说明:
• 类型与变量是不同概念; • 结构体成员可以单独使用; • 成员也可以是结构体变量;
• 成员名称可以与程序中的其它变量名称相同,是两个 不同的对象。
声明后的结构体类型就可以同其它 的数据类型一样用来定义变量等。
结构体中的成员可以是一个简单的 基本类型,也可以是复杂的构造类 型。
类型与变量是不同的概念,这里只 是定义了类型,尚未定义变量,因 此未分配内存空间。
例如: struct School {
char name[32]; int num_staff; int type; };
struct data struct student
{ int month; {
birthday
int day;
unsigned iNnot Nnoam; e age
score month
day
year
int year; char name[32];
};
unsigned short age;
float score;

第11章结构体与共用体

第11章结构体与共用体
第11章 结构体与共用体
1
结构体与共用体
1 2 3 4 5 6 7 定义结构体类型变量的方法 结构体变量的引用 结构体数组 指向结构体类型数据的指针 共用体 枚举类型 用typedef定义类型
2
结构体与共用体

概述
在当代信息处理中,往往需要处理相同的属性、不同的数据 类型,如:人事档案,涉及职员的描述和处理时,有职工的 姓名、性别、年龄、文化程度、工资、住址等数据,其中姓 名、性别、文化程度、住址属于字符型,而年龄则是整型, 工资是实型,这些不同的事物都属于同一个事物(职员)所有 ,本身有内在的关系。
17
指向结构体类型数据的指针
18
指向结构体类型变量的指针
指向结构体变量的指针

一个结构体变量的指针就是该变量所占据的内存段的起始 地址。 指针变量也可用来指向结构体数组中的元素。 C语言规定:可以把(*p).num改用p->num表示,即以下三种 形式等价: 结构变量.成员名 (*p).成员名 p->成员名(其中"->"称为指向运算符)
struct 结构体名 { 成员表列 } 变量名表列;
3. 直接定义结构类型变量:
struct { 成员表列 } 变量名表列;
7
结构体与共用体
定义结构体类型变量的方法
关于结构体类型的说明

类型与变量是不同的概念,不要混同。 通过struct定义的结构体类型和int,float等有着同等的地 位。 只能对变量赋值、存取或运算,而不能对一个类型赋值、 存取或运算。 在编译时,对类型是不分配空间的,只对变量分配内存空 间。 对结构体中的成员(即"域"),可以单独使用,它的作用与 地位相当于普通变量。 成员也可以是一个结构体变量。 成员名可以与程序中的变量名相同,二者不代表同一对象。

预处理命令与结构体练习题答案

预处理命令与结构体练习题答案

第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语言编程:第十一章结构体与共用体

C语言编程:第十一章结构体与共用体
• 例如:表示一个学生的有关信息(学号,姓名,性 别 年龄,总分,地址),其具体数据情况如图所 示: num name sex age score addr
10010 Li Fun M 18 87.5 Bejing
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
11.3 结构体变量的引用
结构体变量的引用应该遵循以下原则 • 1)不能将一个结构体变量作为一个整体进行输入和
2)结构体名同标识 符命名规则;
3)分号不能省略
4)成员列表又称“域表”,每个成员也称为域。
5)指定一个结构体类型相当于指定了一个模型,它无 数据,系统对其不分配实际内存单元。
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
struct { int num;
char name[10]; char sex;
int age; float score; char addr[30]; } student1,student2;
(3)
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@

C语言第11讲--结构体和共用体

C语言第11讲--结构体和共用体
num a[0] a[1] a[2] name(20) score(4)
如:方式(2) 方式 struct student int score[4];}
{long num;char name[20];
结构体数组初始化
a[3]={{20030001,"zhang",89,90,91,92}, {20030002,"liu",68,69,70,71}, {20030003,"li",57,58,59,60} };
第十三讲 特殊数据类型
—— 结构体、共用体、 结构体、共用体、 枚举类型、 枚举类型、自定义类型
§11.1 结构体和共用体概述
数组可以存放一组相关的同类型数据, 数组可以存放一组相关的同类型数据,但是 一组相关的同类型数据 不能将不同类型的数据放入同一数组中。 不能将不同类型的数据放入同一数组中。 如果需要把一个学生的学号、姓名、性别、 如果需要把一个学生的学号、姓名、性别、 年龄、各门功课的考试成绩等不同类型的数 年龄、各门功课的考试成绩等不同类型的数 放在一个构造型数据类型中, 据放在一个构造型数据类型中,就需要另外 一种新的数据类型: 一种新的数据类型:结构体类型或者共用体 类型数据 数据。 类型数据。 一个结构体类型的变量中可以独立存放多种 类型的数据,一个共用体 共用体类型的变量中可以 类型的数据,一个共用体类型的变量中可以 共用同一段存储单元来存放不同类型的数据 来存放不同类型的数据。 共用同一段存储单元来存放不同类型的数据。
4
三、对结构体类型的说明
结构体类型与结构体类型变量是两个概念, 结构体类型与结构体类型变量是两个概念, 应区分结构体名与变量名。 应区分结构体名与变量名。 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。

十一章 结构体与共用体

十一章 结构体与共用体

结构体与共用体一、选择题: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)“结构类型名”和“数据项”的命名规则,与变量 名相同。 (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章-结构体与共用体

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++课件:第11章结构体与共用体

C++课件:第11章结构体与共用体
person={“li li”,’f’, 24, “primary”,1000}; 错!
C++课件:第11章结构体与共用体
例11.2 定义一个结构体类型,包含通讯录中的如下信息: 姓名、年龄、电话、通讯地址;并定义该类型的变量, 输入数据并输出。
程序l11_2.c
#include "stdio.h" struct address_list {char name[10];
/*{}内是该类型的各成员*/
char sex;
int age;
char position[10];
float salary; };
/*语句末尾是“;” */
该结构体类型名为struct teacher,teacher 是该结构体的标识符; 该类型包含有6个成员的数据项:name、 sex、 age、 position 和salary,其中每个成员项都有自己的类型。
}; struct teacher person; /*定义结构体变量person*/
strcpy(,"wang li");
person.sex=‘f’;
/*给各成员赋值*/
person.age=30;
strcpy(person.position,"middle");
person.salary=1600;
C++第11章结构体与共用体
C++课件:第11章结构体与共用体
1、结构体类型的定义 2、结构体变量的定义及引用 3、结构体数组 4、结构体类型的指针 5、链表的基本操作 6、共用体和枚举类型(了解)
C++课件:第11章结构体与共用体

第十一章结构体与共用体

第十一章结构体与共用体
– 为函数间传递不同类型的参数提供了便利。
定义结构体类型
struct 结构体名 {
数据类型 成员名 1; “域” 数据类型 成员名 2;
: 数据类型 成员名 n; }; /*分号不能省略*/第十一章结构体与共用体
结构嵌套
涵义:结构体的成员项也是结构体 只能对最内层结构(最低一级)的成员
项进行赋值或存取,以及运算。 内层结构成员的引用形式:
numbre Name[6] sex age Address[20]
… … 本质上,它定义了一个名为”student”的“结构体类型” 。struct student 相当于标准数据类型关键字char, int ,float…我们可以 用它来定义“结构体变量”。
注意成员定义与普通变量定义的区别: 成员定义时——不为其分配内存 变量定义时——为其分配内存
第十一章结构体与共用体
11.2定义结构体类型变量的方法
1、先定义结构类型,后说明变量
struct 结构名 结构变量名; 注意:
– 结构变量说明必须在结构类型定义之后
例 struct student stul, stu2;
stu1 1001 Zhang Xin m 19 90.5 Shanghai stu2 1002 Wang Li f 20 98 Beijing
{


} stu[3]第;十一章结构体与共用体
例11.2 (p266)候选人得票统计程序。(三个候选人)
· 分析:
– 数据结构: 定义结构体数组变量,含侯选人名,得票数。 数组有3个元素
– 算法要点: 采用strcmp()函数, 将输入的人名与定义初始化的结构体数组中的每一 元素中候选人名比较,若相同则加1。

11第十一章结构体与共用体

11第十一章结构体与共用体

11第十一章结构体与共用体结构体构体结的声、明结构变体的量义以及它定们的别区结构数组体的定义、初化始应及用向结指体变构以及量指结向构数组的指针体共用体声的明其及用引方式枚举型声明及其的用方式引户用自义定型类结构的定义体构结结体构的体应用结构体变量结体构组结数构指针体结构体变量结构体与类型的区别结构体与共体用共用体的定义共用体用共体量变共用的体应结构用与体共体用区的别共用体数组共用体指枚举针的义定枚举型户用自义定类型枚举应用共用的体量变与结构类型的体别区念的概导出实际应在用,常常需将中同不类型数的组合据一个成机的有整体这。

数据些是相联互的。

系一个如学生的有信息:关nmuna e msex ***** iL inmM aeg 18adrd Dalian若使用多个变量则它,之们无间系联;若使用组数,们又它是不一同类型。

必须一种新有数类型据,它既可容纳不同型类子的,又能项将子各项联成一体。

系就这是构体结型。

类数结构据描上述信述息。

什么是结体?构构体结是一组不类型同变的的量合。

集(这些量叫成员。

) 这变是C言语提的又供种一户自定义用、含的多种有型成类的员新类型是。

又一语言种级数据构。

结同不数于组的,是构结名体不字是再地址其;成组成员可以类型各不同相即不,等再小;大只有储是存连续的。

另,外每个成员拥都有己的存自储空间由。

是于型,所以不占用存储空类,间只而是给结体构量提供了变内布存局的模版。

构体结声的声明方明式:关键s字rutct结构名{ 新体型类结构名体员成表列类型块模} 一;要有分定号结构的体成可以员变量、数组、指针、甚是至其是它结体构量,变但们已它成组一个了可不分的整割。

体如例stru:c tstudnt e{char n ame20][ ;it idn f;lot chineaes ;lfat oenlisgh ;fola taeravg; };e结构体的储存模式ame[0n] //构结体名。

ch ar/结构体/成员1/ ../ d ini // .. ftoatlc ihens e/ /.. / /. otngeisl hveeagre float.结构体变量定的义结构体变量的定有义三方种:式1.声先明结构类型体再,定义该型类量:变trust ctsudnt setu1,stu;结构体类2名结构体变型量名如同:in于数据类t型a1a,2; 变名量样这便于修做,改便于使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三种方法:
一、先定义结构体类型再定义结构体变量

struct 结构体类型名
{ 类型标识符 成员名;
:
类型标识符 成员名;
};
struct 结构体类型名 变量名1,变量名2...;
例如:struct student { char number[10]; char name[20]; char sex; int age; float score[20]; char addr[30]; }; struct student x1,x2;
程序如下: struet person { char name[20]; int count; } leader[3]={"Li", o,"Zhang" , o, " Fang ", o};
main ( ) {int i, j;
chr leader_name[20]; for (i=1; i<=10; i++)
• printf("%ld %-15s %3c %6d %6.2f\n",student[i].num,student[i].name,

student[i].sex,student[i].age,student[i].score);
•}
第四节 结构体变量的初始化
与其它变量的初始化完全一样,结构体变量在定 义时可初始化:
3、用“&”运算符可以取结构体变量的首地址 和某个成员的首地址。例如:
printf(“%d\n”,&stud); scanf(“%c\n”,&stud.sex);
scanf(“%d\n”,&stud.birthday.month);
对数组成员的首地址,可以省略地址运算符, 如:
scanf(“%s”,);
stud[1].name, stud[1].age, stud[1].score);
例:有三个侯选人,每一侯选人的数据包括其姓名和 得票数,则可定义结构类型person和结构数组leader
struct person { char name[20]; int count; } leader[3]={"Li", o,"Zhang" , o, " Fang ", o};
4、对成员变量可以象普通变量一样进行各种运 算,例如:
sum=stud.score[0]+ stud.score[1]+ stud.score[2]
结构体变量的输入和输出
• C语言不允许把一个结构体变量作为一个整体进行输入或输 出的操作。例如: struct { long num; char name[20]; } stud;
上述定义中: struct ––– 关键词(保留字), 表示定义一种结
构体类型。
strudent –––结构体名, 相当于类型名(int, float等)
其一般形式: struct 结构体名 {成员表列};
成员表列:类型标识符 成员名
以上仅说明了定义一种类型的方法,尚未定 义变量。
第二节 定义结构体变量
1. 类型名与变量名是不同的概念 2. 允许成员名又为另一个已定义的结构型变量 3. 每一个成员地位如同该类型的变量 4. 成员名与程序中的变量名可相同但意义不同
一个嵌套定义的例子:
struct date { int month; int day; int year; }
struct student {int num; char name[20]; char sex; int age; struct date birthday; char addr[30]; } x1, x2;
• main()
• { struct stud student[3];
• int i; char ch; char numstr[20];
• for(i=0;i<3;i++)
• {gets(numstr); student[i].num=atol(numstr);
• gets(student[i].name);
int age;
float score; };
struct student stud[3];
结构体数组在内存中的存储:
(1)按数组下标由小到大 (2)在给每个数组元素的空间内再按
照成员的顺序连续存放。
stud[0] 9701,"liMing",20,98 stud[1] 9702, "WangDan", 20,95 stud[2] 9703, "LiHui", 19,80
第十一章 结构体与共用体
第一节 结构体及其类型定义
数组––– 同种数据类型的集合 实际问题中:存在不同类型的数据构成的集合。
例:建立学生档案 每一个学生:学号(int num) 姓名(char name[20]) 性别(char sex) 年龄(int age)
成绩(float score) 地址(char addr[30]) 可将上述数据的集合定义为一种结构体类型: struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }
}
运行情况如下: Li Li Fun Zhang Zhang Fun Li Fun Zhang Li
name Li Zhang Fun
count 0 0 0
Li : 4 Zhang : 3 Fun : 3
• 一个结构体的成员名字不能相同,但两个结构 体中可以使用同名成员,成员名也可以与程序 中的变量名相同,二者代表不同的对象;
• 成员也可以是一个结构体变量(嵌套)。
第五节 结构体数组
同数组定义类似
定义
方法一
先定义结构体类型,再定义结构体数组。
struct student
{ long num;
char name[20];程序运行结果 如下:128 a b
i=128,ch1=a,ch 2=b
• printf("i=%d,ch1=%c,ch2=%c\n",i,ch1,ch2);
•}
• 输入示例2:输入3个学生的信息并输出。 • #include "stdlib.h" • #include "stdio.h" • struct stud • { long num; • char name[20]; • char sex; • int age; • float score; • };
}
2、尽量避免用一个scanf函数输入包含字符数 据在内的一组不同类型的数据,以免出错。 处理办法:各种数据都用gets函数输入,然 后再用转换函数进行转换:
– atoi() 将字符串转换成整型
– atof() 将字符串转换成double型实数
– atol() 将字符串转换成长整型
• 这三个函数要用#include命令将“stdlib.h” 文件包含进来。
main()
{struct {int i; char ch1;
输入125 a b 运行结果?
char ch2;
i=125,ch1= ,ch2=a
}tt;
scanf(“%d%c%c”,&tt.i,&tt.ch1,&tt.ch2);
printf(“i=%d,ch1=%c,ch2=%c”,tt.i,tt.ch1,tt.ch2);
9701 LiMing 20 98 9702 WangDan 20 95 9703 LiHui 19 80
初始化
struct student { long num; char name[20]; int age; float score;
}stud[3]={{9701,"liMing",20,98}, {9702, "WangDan",20,95}, {9703, "LiHui",19,80}};
• student[i].sex=getchar(); ch=getchar();
• gets(numstr); student[i].age=atoi(numstr);
• gets(numstr); student[i].score=atof(numstr); }
• for(i=0;i<3;i++)
不允许 scanf("%d",&stud); printf("%d",stud);
可以用 scanf("%ld%s",&stud.num,); printf("%ld,%s", stud.num, );
注意:
1、由于结构体是由不同类型成员组成的,所以在用scanf函 数输入不同类型数据时有时会出现预料不到的事情,例如:
:
类型标识符 成员名;
}变量名1,变量名2,...;
struct student { char number[10];
char name[20]; char sex; int age; float score[20]; char addr[30]; }x1,x2;
三、直接定义结构类型变量
利用无名结构体类型定义变 量。
struct { 类型标识符 成员名;
: 类型标识符 成员名; }变量名1,变量名2,......;
struct { char number[10]; char name[20]; char sex; int age; float score[20]; char addr[30]; }x1,x2;
相关文档
最新文档