结构体
1.自己建立结构体类型
有程序员自己建立的由不同数据组成的组合型的数据结构称为结构体。
声明一个结构体的一般形式为:
struct 结构体名:
{成员列表名};
示例:
struct Student
{
int num; //学号为整形
char name[20]; //姓名为字符串
char sex; //性别为自字符型
int age; //年龄为整形
float score; //成绩为实型地址为字符串
char addr[30]; //
}; 这个一定要注意加分号。
上面的程序就设定了一个结构体类型struct Student。但是这个程序仅仅是建立了一个结构体类型,并没有定义变量,并且其中并无具体的数据,系统对之也不分配存储单元,为了使用结构体类型中的数据,应当定义结构体类型的变量,并在其中存放具体的数据。可以采取以下几种方法:
(1)先声明结构体类型,在定义该类型的变量。
如上面的示例已经声明了一个结构体变量struct Student,可以用它来定义变量,
如:
struct Studentstudent1,student2;
(2)在声明变量的同时定义变量。如:
struct Student
{
int num; //学号为整形
char name[20]; //姓名为字符串
char sex; //性别为自字符型
int age; //年龄为整形
float score; //成绩为实型地址为字符串
char addr[30]; //
}student1,student2; 这个一定要注意加分号。
这种定义方法的一般形式为:
struct 结构体名
{
成员表列
}变量名表列;
(3)不指定类型名而直接定义结构体类型变量
一般形式为:
struct
{
成员表列
}变量名表列;
指定了一个无名的结构体类型,它没有名字。尽量不要使用这种方法,因为不能再以此结构体类型去定义其他变量。
说明:
(1)结构体类型与结构体变量是不同的概念。只能对变量赋值、存取或者运算。而不能对一个类型赋值,存取或者运算。在编译时对类型是不分配存储空间的,支队变量分配存储空间。
(2)结构体类型中的成员名可以和程序中的变量名相同,但是二者不代表同一个对象,
(3)对结构体变量中的成员,可以单独使用,他的作用和地位相当于普通变量。
2.结构体变量的初始化和引用
(1)可以再定一结构体是就给他赋值,初始列表是用花括号括起来的一些常量,这些常量依次赋值给结构体变量中的各个成员。
小练习:
#include<stdio.h>
int main()
{
struct Student
{
long int num;
char name[20];
char sex;
char addr[20];
}a= {10101,"lilin",'m',"123 beijing road"};
printf("%ld,%s,%c,%s",a.num,a.name,a.sex,a.addr);
rerurn 0;
}
输出结果为:
注意在对结构体变量初始化时要用大括号括起来。另外C语言允许对某一个成员变量赋值,如:
struct Student b= {.name="zhang"};
(2)结构体变量中成员变量的引用
如:
student1.name表示student1中成员变量中的num成员。
程序中可以对变量的成员赋值,如:
student1.number=10010;
其中的“.”是成员运算符,他在所有的运算符中优先级最高。
需要注意的是不能企图输出结构体变量名达到输出结构体变量的所有成员值的目的。
下面的用法是不正确的:
printf(“%s\n”,student1);
只能对结构体变量中各个成员分别进行输入和输出。
(3)结构体变量的成员可以像普通变量一样进行各种运算,如:
student2.score=student1.score;
sum=student1.score+student2.score;
student2.age++;
(4)同类的结构体变量可以相互赋值。如:
student1=student2;
(5)可以引用结构体变量的地址,也可以引用结构体变量成员的地址。如:
scanf("%d",&student1.num);
printf("%o",&student1);
小练习:
/*
用结构体输入两个学生的学号、姓名和成绩,输出 成绩较高的学生的学号、姓名和成绩。
*/
#include <stdio.h>
struct Student
{
int num;
char name[20];
float score;
};
void main()
{
struct Student student1,student2;
scanf("%d %s %f",&student1.num,&student1.name,&student1.score);
scanf("%d %s %f",&student2.num,&student2.name,&student2.score);
if(student1.score>student2.score)
printf("%s(%d):%6.2f\n",student1.name,student1.num,student1.score);
else
printf("%s(%d):%6.2f\n",student2.name,student2.num,student2.score);
}
运行结果为“
结构体数组
1.如果一个数组中存放的都是整数就称为整形数组,如果都是字符就称为字符型数组,如果都是i、结构体就称为结构体数组。
下面通过一个简单的例子来说明怎样定义和引用结构体数组
示例:
解题思路:
运行结果为:
- 设一个结构体数组,数组中包含3个元素
- 每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)
- 输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1
- 输出所有元素的信息
#include <string.h>
#include <stdio.h>
struct person // 声明结构体类型struct person
{char name[20]; // 候选人姓名
int count; // 候选人得票数
} leader[3]={"Li",0,"Zhang",0,"Fun",0}; // 定义结构体数组并初始化
int main()
{int i,j;
char leader_name[20]; // 定义字符数组
for (i=1;i<=10;i++)
{scanf("%s",leader_name); // 输入所选的候选人姓名
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
}
printf("\nResult:\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
return 0;
}
运行结果为:
下面总结定义结构体数组的一般方式:
(1)struct 结构体名
{成员表列}数组名 [数组长度];
(2)先声明一个结构体类型,在 用此类型定义结构体数组。
结构体类型
数组名 [数组长度];
如:
struct Personleader[3];
2.结构体数组应用举例
/*有n个学生的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。*/
#include<stdio.h>
struct student
{
int number;
char name[20];
int score;
};
int main(void)
{ struct student stu[5]={001,"wang",80,002,"zhang",89,003,"wang",60,004,"zhao",97,005,"sun",100};
struct student temp;
const int n=5;
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
{
if(stu[j].score>stu[k].score)
k=j;
temp=stu[k];stu[k]=stu[i];stu[i]=temp;
}
}
for (i=0;i<n;i++)
{
}
return 0;
}
运行结果为:
结构体指针
1.所谓结构体指针就是指向结构体变量的指针,这个结构体变量的起始地址就是这个结构体变量的指针。
2.指向结构体对象的指针变量既可以指向结构体变量也可以指向结构体数组中的元素。指针变量的类型必须与结构体变量的类型相同。
如:
struct Student *st;
这样st就可以指向struct Student *st类型的结构体变量或者数组元素。
小练习:
#include<stdio.h>
#include<string.h>
main()
{
struct student
{long num;
char name[20];
char sex;
float score;
};
struct student stu1;
struct student *p;
p=&stu1;
printf("input num,name,sex,score:\n");
scanf("%ld%s%c%f",&stu1.num,&stu1.name,&stu1.sex,&stu1.score);
printf("no.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",
stu1.num,stu1.name,stu1.sex,stu1.score);
printf("\nno.%ld\nname:%s\nsex:%c\nscore:%5.1f\n",
(*p).num,(*p).name,(*p).sex,(*p).score);
return 0;
}
运行结果显示一样,所以可以使用指针指向结构体数组。