论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C语言教程:结构体类型变量的定义和引用

文章类别:C语言程序设计 | 发表日期:2010-11-18 9:16:07

C语言教程:结构体类型变量的定义和引用

 

前面的课程我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。对简单数据类型来说,既可以定义单个的变量,
也可以定义数组。而数组的全部元素都具有相同的数据类型,或者说是相同数据类型的一个集合。
在日常生活中,我们常会遇到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。
在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中我们通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E - m a i l等项目。这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,因此C引入一种能集中不同数据类型于一体的数据类型—结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。
在上面描述的各种登记表中,让我们仔细观察一下住宿表、成绩表、通讯地址等。
住宿表由下面的项目构成:

 

这些登记表用C提供的结构体类型描述如下:
住宿表:
struct accommod
{
char name[20]; / *姓名* /
char sex; / *性别* /
char job[40]; / *职业* /
int age; / *年龄* /
long number; / *身份证号码* /
} ;
成绩表:
struct score
{
char grade[20]; / * 班级* /
long number; / * 学号* /
char name[20]; / *姓名* /
float os; / *操作系统* /
float datastru; / * 数据结构* /
float compnet; / * 计算机网络* /
} ;
通讯地址表:
struct addr
{
char name[20];
char department[30];/ * 部门* /
char address[30]; / *住址* /
long box; / * 邮编* /
long phone; / * 电话号码* /
char email[30]; / * E m a i l * /
};
这一系列对不同登记表的数据结构的描述类型称为结构体类型。由于不同的问题有不同的数据成员,也就是说有不同描述的结构体类型。我们也可以理解为结构体类型根据所针对的问题其成员是不同的,可以有任意多的结构体类型描述。
下面给出C对结构体类型的定义形式:
struct 结构体名
{
成员项表列
};
有了结构体类型,我们就可以定义结构体类型变量,以对不同变量的各成员进行引用。
7.1.1 结构体类型变量的定义
结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共计有三种形式,分别介绍如下:
1) 先定义结构体类型,再定义结构体类型变量:
struct stu / *定义学生结构体类型* /
{
char name[20]; / * 学生姓名* /
char sex; / * 性别* /
long num; / *学号* /
float score[3]; / * 三科考试成绩* /
};
struct stu student1,student2;/ * 定义结构体类型变量* /
struct stu student3,student4;
用此结构体类型,可以定义更多的该结构体类型变量。
2 ) 定义结构体类型同时定义结构体类型变量:
struct data
{
int day;
int month;
int year;
} time1,time2;
也可以再定义如下变量:
struct data time3,time4;
用此结构体类型,同样可以定义更多的该结构体类型变量。
3) 直接定义结构体类型变量:
struct
{
char name[20]; / *学生姓名* /
char sex; / *性别* /
long num; / *学号* /
float score[3]; / *三科考试成绩* /
} person1,person2; / *定义该结构体类型变量* /
该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。

7.1.2 结构体类型变量的引用

 

学习了怎样定义结构体类型和结构体类型变量,怎样正确地引用该结构体类型变量的成员呢?C 规定引用的形式为:
<结构体类型变量名> . <成员名>
若我们定义的结构体类型及变量如下:
struct data
{
int day;
int month;
int year;
} time1,time2;
则变量time1和time2各成员的引用形式为:time1.day、
time1.month、time1.year及time2.day、time2.month、
time2.year,如图7-1所示。
其结构体类型变量的各成员与相应的简单类型变量使
用方法完全相同。
7.1.3结构体类型变量的初始化
由于结构体类型变量汇集了各类不同数据类型的成员,所以结构体类型变量的初始化就略显复杂。
结构体类型变量的定义和初始化为:
struct stu / *定义学生结构体类型* /
{
char name[20]; / * 学生姓名* /
char sex; / * 性别* /
long num; / *学号* /
float score[3]; / * 三科考试成绩* /
};
struct stu student={"liping",'f',970541,98.5,97.4,95};

 

我们也可以通过C提供的输入输出函数完成对结构体类型变量成员的输入输出。由于结构体类型变量成员的数据类型通常是不一样的,所以要将结构体类型变量成员以字符串的形式输入,利用C的类型转换函数将其转换为所需类型。类型转换的函数是:
int atoi(char *str);转换str所指向的字符串为整型,其函数的返回值为整型。
double atof(char*str);转换str所指向的字符串为实型,其函数的返回值为双精度的实型。
long atol(char*str);转换str所指向的字符串为长整型,其函数的返回值为长整型。
使用上述函数,要包含头文件"stdlib.h"。
对上述的结构体类型变量成员输入采用的一般形式:
char temp[20];
gets(student.name);/*输入姓名*/
student.sex=getchar();/*输入性别*/
gets(temp);/*输入学号*/
student.num=atol(temp);/*转换为长整型*/
for(i=0;i<3;i++)/*输入三科成绩*/
{
gets(temp);
student.score[i]=atoi(temp);
}
对该结构体类型变量成员的输出也必须采用各成员独立输出,而不能将结构体类型变量以整体的形式输入输出。
C允许针对具体问题定义各种各样的结构体类型,甚至是嵌套的结构体类型。
structdata
{
intday;
上述对结构体类型变量的三种定义形式均可在定义时初始化。结构体类型变量完成初始化后,即各成员的值分别为:student.name="liping"、student.sex='f'、student.num=970541、
student.score[0]=98.5、student.score[1]=97.4、student.score[2]=95。其存储在内存的情况如图7-2所示。
int mouth;
int year;
} ;
struct stu
{
char name[20];
struct data birthday; 出/*生年月,嵌套的结构体类型*/
long num;
} person;
该结构体类型变量成员的引用形式: person.name 、person.birthday.day、person. birthday.month、person. birthday. y e a r、person.num 。

 

进入C语言程序设计视频教程专区

视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058