1.前言
在学习数据结构之前学会自己建立数据类型是必要的,因为学习数据结构时,对于线性表,栈,树等等我们都需要根据它们的特点去建立相应的数据类型。例如:我们声明线性表的顺序存储类型时,我们需要一个数组去存储线性表中的所有元素,还需要一个整型变量来存储线性表的实际长度。这时候C语言所提供的一些已经由系统所定义好的数据类型(int,float,char等)就不足以完成这个任务,就需要了解下面的介绍。
2.定义和使用结构体
在生活中我们常常遇到一些彼此之间存在联系,成组出现的数据。如果我们将其分别定位为互相独立的简单变量,就难以体现他们之间的内在联系。例如:描述一个学生的各项信息,包括:姓名(name),性别(sex),年龄(age),成绩(grade),住址(address)。我们希望它们能组成一个组合数据,此时数组就不足以完成这个任务,因为一个数组中只能放同一类型的数据。
C语言允许用户自己建立不同类型数据组成的组合型的数据结构,它就是结构体。例如对于上面对一个学生各项信息的描述我们就可以建立一个结构体。
struct Student
{
char name[20]; //姓名
char sex; //性别
int age; //年龄
int grade; //成绩
char address[20];//地址
};
上述结构体的结构体类型被指定为struct Student,经过上述指定 struct Student就是一个合法类型名。由此可以得出声明一个结构体的一般格式为:
struct 结构体名
{成员表列};
2.1定义结构体类型变量
定义结构体类型变量可以采取三种方式:
1、先声明结构体类型,再定义该类型的变量
假设我们已经声明了一个结构体类型struct Student,可以用它来定义变量,例如:
struct Student student1,student2;
2、在声明类型的同时定义变量
struct Student
{
char name[20]; //姓名
char sex; //性别
int age; //年龄
int grade; //成绩
char address[20];//地址
}student1,student2;
这种的一般形式为:
struct 结构体名
{
成员表列
}变量名表列;
3、不指定类型名而直接定义结构体类型变量
一般形式:
stuct
{
成员表列
}变量表列;
这里指定了一个无名的结构体类型,它没有名字。显然不能再以此结构体类型去定义其他变量。
3.结构体变量的初始化和引用
这里举出一个例子:将一个学生的信息放在一个结构体中并输出。
3.1声明的同时对其初始化
#include<stdio.h>
#include<string.h>
int main()
{
struct Student
{
char name[20];
char sex;
int age;
int grade;
char address[20];
} a={"Tom",'M',20,100,"America"};
printf("name:%s\nsex:%c\nage:%d\ngrade:%d\naddress:%s",a.name,a.sex,a.age,a.grade,a.address);
return 0;
}
结果:
3.2先声明再对其初始化
#include<stdio.h>
#include<string.h>
int main()
{
struct Student
{
char name[20];
char sex;
int age;
int grade;
char address[20];
} a;
printf("输入信息:");
scanf("%s %c %d %d %s",&a.name,&a.sex,&a.age,&a.grade,&a.address);
printf("信息如下:\n");
printf("name:%s\nsex:%c\nage:%d\ngrade:%d\naddress:%s",a.name,a.sex,a.age,a.grade,a.address);
return 0;
}
结果:
4.结构体指针
指向结构体对象的指针既可以指向结构体变量也可以指向结构体数组中的元素。指针变量的基类型必须与结构体变量相同。例如:
struct Student *p; // p可以指向struct Student类型的变量和数组元素
下面举出一个使用指向结构体变量的指针输出结构体变量中的成员的信息的例子。
#include<stdio.h>
#include<string.h>
int main()
{
struct Student
{
char name[20]; //姓名
char sex; //性别
int age; //年龄
char address[20]; //住址
};
struct Student stu1;//定义结构体变量
struct Student *p;//定义指向struct Student类型数据的指针变量p
p=&stu1; //p指向stu1
strcpy(stu1.name,"小明");
stu1.sex='M';
stu1.age=20;
strcpy(stu1.address,"开封");
printf("姓名:%s\n性别:%c\n年龄:%d\n住址:%s\n",(*p).name,(*p).sex,(*p).age,(*p).address);
return 0;
}
最后p指向一个结构体变量stu,有以下三种用法等价:
1.stu.成员名(如stu.num);
2.(*p).成员名(如(*p).num);
3.p->成员名(如p->num);
最后不足错误之处还请多多指点。