文档介绍:该【结构体共用体讲课文档 】是由【知识徜徉土豆】上传分享,文档一共【95】页,该文档可以免费在线阅读,需要了解更多关于【结构体共用体讲课文档 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。结构体共用体
第1页,共95页。
(优选)结构体共用体
第2页,共95页。
§ 结构体类型的定义
一、结构体类型定义格式
结构体是一种构造类型,该类型必须先定义,后使用。
struct 是定义结构体类型的关键字;“struct 结构体类型名”是创建结构体变量的类型名—相当于int、float。
结构体{ }中的每项数据,称为结构体的“成员” 或“分量”
结构体类型名、成员名都是标识符。花括号后必须有分号
结构体成员可以是基本类型的变量、数组或指针,也可以是其他结构体、共用体的变量、数组或指针—可以嵌套定义。
struct 结构体类型名
{ 类型 成员名1;
……
类型 成员名n;
};
结构体类型的作用范围:
根据定义位置为局部、全局的结构体类型;
引用其他文件定义的结构体,可用#include包含该文件。
struct student /*学生结构体*/
{ int num ; /* 学号 */ char name[20]; /* 姓名 */ float score; /* 成绩 */}; /* 语句末尾必须有分号*/
第3页,共95页。
[例]结构体类型的定义
含有学生学号、姓名、性别、年龄、成绩、地址的结构体类型:
struct student
{ int num ; /* 学号 */ char name[20]; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr[30]; /* 地址 */
}; /* 语句末尾必须有分号*/
struct student是定义的结构体类型名,该类型包含有6个成员:num、name、 sex、 age、 score和addr。
注意: struct student只是声明了一种新的结构体类型,如同char、int、float不占据内存—不能存储数据。
结构体中的数据成员不是变量的定义,只是纯粹的声明。如num、 age等没有内存单元,只有用结构体类型定义结构体变量时系统按各成员变量为结构体变量分配内存以存放具体数据。
第4页,共95页。
二、结构体变量的定义
1、先定义结构体类型,再单独定义结构体变量:
struct student
{ … } ;
struct student s1 , s2 ;
注意:第三种方法无法再定义新的结构体变量。
定义结构体类型struct student后,与系统定义的类型int、long、float 一样,可用来定义该类型的变量、数组、指针、函数等。
2、在定义结构体类型的同时定义结构体变量:
struct student
{ … }s1 , s2 ;
3、直接定义结构体变量
struct
{ … }s1 , s2 ;
C++结构体名可直接做为类型名
struct student
{ … } ;
student s1 , s2 ;
定义结构体变量就是按类型的定义为各成员依次分配内存。
结构体变量的地址就是第一个成员的地址。
结构体变量占内存的字节数是各个成员占内存字节数的总和。
s1
s2
59字节 int 2 char 20 char 1 int 2 float 4 char 30
&s1
第5页,共95页。
三、结构体变量的引用
[例] 定义一个结构体变量,存放一个教师的信息并输出。
#include ""
main()
{ struct teacher /*局部结构体类型,作用域为本函数内*/
{ char name[20] ; /*姓名*/
char sex ; /*性别*/
int age ; /*年龄*/
char position[10] ; /*职务*/
float salary ; /*工资*/
} ; /*可在此分号前直接定义结构体变量 */
struct teacher p ; /*定义结构体局部变量p */
strcpy( , "wang li") ; /*给各成员赋值*/
=‘f ’ ; =30;
strcpy( , "middle") ;
=1600 ;
printf("\n name sex age position salary") ;
printf("\n%-10s %3c %5d %10s %" ,
, , , , ) ; }
一般情况下,不能将结构体变量作为整体来使用,只能用“成员运算符”(分量运算符)“ . ” 引用其成员:
结构体变量名 . 成员名
如果有运算:++
则等价于:()++
第6页,共95页。
[例] 定义通讯录的结构体类型
通讯录包含下列信息:姓名、年龄、电话、通讯地址;定义结构体变量,输入数据并输出。
#include ""
struct address_list /*在函数体外定义全局结构体类型*/
{ char name[10] ; /*该类型的作用域为本程序内*/
int age ;
char tel[10] ;
char address[40] ;
}; /*可在此定义结构体全局变量*/
main()
{ struct address_list s ; /*定义结构体局部变量s,占62字节内存*/
printf("\n input name:") ; gets() ;
printf("input age:") ; scanf("%d", &) ; getchar() ;
printf("input tel:") ; gets() ;
printf("input address:") ; gets();
printf("name age tel address\n");
printf("%5s%6d%10s %-40s\n", , , , ) ;
}
第7页,共95页。
[例]结构体的嵌套定义
增加一个出生日期:定义为含有年、月、日的结构体类型,然后嵌入struct student_1中(嵌套定义)。
定义后嵌入(常用方式):
struct date_type
{ int year ;
int month ;
int day ; } ;
struct student_1
{ int num ;
char name[20] ;
char sex ;
int age;
struct date_type birthday ;
float score ; char addr[30];
} ;
直接嵌套定义:
struct student_1
{ int num ;
char name[20] ;
char sex ;
int age;
struct date_type
{ int year;
int month;
int day;
} birthday ;
float score ; char addr[30];
} ;
num name sex age score addr
birthday
month day year
第8页,共95页。
四、结构体变量的初始化
结构体变量也可以在定义的同时初始化,各成员数据之间用逗号分开,并用{ }括起来。
[例] 定义一结构体类型,包含工人的:编号、姓名、工资。定义变量存放两人的数据,然后交换,输出交换前后的信息。
#include ""
main()
{struct salary_list
{char no[10] ;
char name[30] ;
float salary ;
} z , x={"10","li ming", 2000} ; /*结构体变量的初始化*/
struct salary_list y={"12","wang yan", 2500 } ;
printf(" no name salary\n");
printf("x:%-5s%-9s%\n", , , ) ;
printf("y:%-5s%-9s%\n", , , ) ;
z=x; x=y; y=z; /*交换两个结构体变量*/
printf("after exchange:\n") ;
printf("x:%-5s%-9s%\n", , , ) ;
printf("y:%-5s%-9s%\n", , , ) ;
}
注意:同类型的结构体变量可以整体赋值,即可以将一个结构体变量整体赋给相同类型的另一个结构体变量。
第9页,共95页。
说明:
先定义结构体类型,后定义结构体变量。注意区分定义类型和定义变量两个不同的概念。
结构体成员单独引用时相当于普通变量;成员名可以与程序中其他变量名相同,互不影响。
当成员是另一个结构体变量时,应一级一级地引用。
如: ;
除了初始化,对结构体变量的赋值、输入、输出操作时,需分别访问各个成员,不能整体赋值或输入输出。
如:printf("%s%c%d%s%f", p); 错!
p={"wang li", 'f ', 30, "middle", 1600 } ; 错!
仅在以下情况,可把结构体变量作为一个整体访问:
(1)初始化: struct student s1={ 20001, "li ming", ……} ;
(2)结构体变量之间整体赋值。如:p2=p1;
(3)取结构体变量地址:printf("%x", &p); 输出p的地址
struct teacher *f=&p ; f是指向结构体变量的指针
(4)结构体变量做函数参数。
第10页,共95页。