零、本节学习目标
理解C语言结构体 掌握如何定义结构体 掌握如何使用结构体
一、结构体
(一)结构体概述
“结构体类型”是由不同数据类型变量组成的集合体,相当于其它高级语言中的记录。结构体类型的数据由若干称为“成员”的数据组成,每个成员既可以是一个基本数据类型的数据,也可以是另一个构造类型的数据。
(二)结构体定义
struct 类型名 {
类型1 成员名1 ;
类型2 成员名2 ;
……
} ;
以上整个部分是一个数据类型,与整型的int是同样地位。可用typedef把结构体类型替换成一个只有几个字母的简短标识符。
(三)结构体变量的声明
结构体变量是用说明的结构体类型所定义的一个变量,与结构体类型不是一回事。一个结构体变量所占字节数为其所有成员所占字节数之和。如struct Student {char name[10]; int age;} a, b; 则表明定义了两个结构体变量a,b,每个变量占14个字节。a,b与int i, j; 中的变量i,j是同样地位。
(四)结构体成员的引用
引用成员可用以下3种方式:(1)结构体变量名.成员名;(2)指针变量名->成员名:(3)(*指针变量名).成员名。点(.)称为成员运算符,箭头(->)称为结构指向运算符。
二、案例演示
(一)定义与使用结构体
1、编写程序 - 定义与使用结构体.c
# include <stdio.h>
# include <string.h>
struct Student
{
int num;
char name[ 20 ] ;
char sex[ 4 ] ;
int age;
double score;
char address[ 30 ] ;
} ;
void main ( ) {
struct Student stu1, stu2, stu3;
stu1. num = 1 ;
strcpy ( stu1. name, "李平" ) ;
strcpy ( stu1. sex, "男" ) ;
stu1. age = 18 ;
stu1. score = 98.5 ;
strcpy ( stu1. address, "泸州江阳区瓦窑坝35#" ) ;
stu2. num = 2 ;
strcpy ( stu2. name, "王红" ) ;
strcpy ( stu2. sex, "女" ) ;
stu2. age = 19 ;
stu2. score = 99.5 ;
strcpy ( stu2. address, "泸州龙马潭区潇湘路15#" ) ;
stu3. num = 3 ;
strcpy ( stu3. name, "张枫" ) ;
strcpy ( stu3. sex, "男" ) ;
stu3. age = 21 ;
stu3. score = 69.0 ;
strcpy ( stu3. address, "泸州龙马潭区潇湘路15#" ) ;
printf ( "学号\t姓名\t性别\t年龄\t成绩\t家庭住址\n" ) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , stu1. num, stu1. name, stu1. sex, stu1. age, stu1. score, stu1. address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , stu2. num, stu2. name, stu2. sex, stu2. age, stu2. score, stu2. address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , stu3. num, stu3. name, stu3. sex, stu3. age, stu3. score, stu3. address) ;
}
2、运行程序,查看结果
3、课堂练习:利用结构体数组来完成上述任务。
(二)使用指针指向结构体
1、编写程序 - 使用指针指向结构体.c
# include <stdio.h>
# include <string.h>
struct Student
{
int num;
char name[ 20 ] ;
char sex[ 4 ] ;
int age;
double score;
char address[ 30 ] ;
} ;
void main ( ) {
struct Student stu1, stu2, stu3;
struct Student * s1, * s2, * s3;
s1 = & stu1;
s2 = & stu2;
s3 = & stu3;
s1-> num = 1 ;
strcpy ( s1-> name, "李平" ) ;
strcpy ( s1-> sex, "男" ) ;
s1-> age = 18 ;
s1-> score = 98.5 ;
strcpy ( s1-> address, "泸州江阳区瓦窑坝35#" ) ;
s2-> num = 2 ;
strcpy ( s2-> name, "王红" ) ;
strcpy ( s2-> sex, "女" ) ;
s2-> age = 19 ;
s2-> score = 99.5 ;
strcpy ( s2-> address, "泸州龙马潭区潇湘路15#" ) ;
s3-> num = 3 ;
strcpy ( s3-> name, "张枫" ) ;
strcpy ( s3-> sex, "男" ) ;
s3-> age = 21 ;
s3-> score = 69.0 ;
strcpy ( s3-> address, "泸州龙马潭区潇湘路15#" ) ;
printf ( "学号\t姓名\t性别\t年龄\t成绩\t家庭住址\n" ) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , s1-> num, s1-> name, s1-> sex, s1-> age, s1-> score, s1-> address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , s2-> num, s2-> name, s2-> sex, s2-> age, s2-> score, s2-> address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , s3-> num, s3-> name, s3-> sex, s3-> age, s3-> score, s3-> address) ;
}
2、运行程序,查看结果
printf ( "学号\t姓名\t性别\t年龄\t成绩\t家庭住址\n" ) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , ( * s1) . num, ( * s1) . name, ( * s1) . sex, ( * s1) . age, ( * s1) . score, ( * s1) . address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , ( * s2) . num, ( * s2) . name, ( * s2) . sex, ( * s2) . age, ( * s2) . score, ( * s2) . address) ;
printf ( "%d\t%s\t%s\t%d\t%.2f\t%s\n" , ( * s3) . num, ( * s3) . name, ( * s3) . sex, ( * s3) . age, ( * s3) . score, ( * s3) . address) ;