结构体类型和结构体变量
1.声明一个结构体类型的一般形式为:
struct 结构体名:用来标识一个结构体
{
成员列表:成员可以是任何c语言的数据类型
}; 注意:这里一定要写分号;因为声明结构体也是一个c语言语句
声明了一个结构体,相当于构造了一种新的数据类型,此时系统并不为它分配内存空间,只有定义力结构体类型的变量,系统才为该变量分配内存空间,声明了结构体后,就可以定义结构体类型的变量
2.定义一个结构体类型的变量
(1)先声明结构体类型再定义变量名
strucu studnet{
int num;
int age;
char sex;
};
student1={1101,17,'f'};
student2={1102,19,'m'};
(2)声明结构体类型同时定义变量名
struct student{
int num;
int age;
char sex;
} student1,student2;
(3)不指定类型名直接定义结构体类型变量
struct student{
int num;
int age;
char sex;
}a={1101,18,'f'};
3.引用结构体变量
类型名.成员名
同一结构体变量之间可以直接赋值(整体赋值,成员逐个依次赋值)
结构体数组
定义一个结构体数组
struct student{
intnum;
char name[20];
char sex;
int age;
float score;
char addr[30];
}struct student[3];
结构体数组初始化
struct student{
int num;
...
}
struct student stu[]{ {...},{...},{...}...};
结构体指针
若p指向一个结构体变量
(1)结构体变量.成员名 如 s.sum
(2)(*结构体指针变量).成员名 如(*p).num
(3)结构体指针变量->成员名 如 p->num
#include<stdio.h>
struct students{
int num;
char name[20];
char sex;
int agr;
};
struct students stu[3]={{101,"ling",'M',18},{102,"zhao",'F'19},{103,"zhang",'M',17}};%
void main()
{
struct student *p;
printf("num name sex age\n"};
for(p=stu;p<stu+3;p++)
printf("%5d%-20s%2c%4d\n",p->num,p->name,p->sex,p->age};
}
结构体指针作为函数参数
结构体变量名代表整个结构体变量本身,当把结构体变量本身作为参数传递时,结构体内部的结构体成员较多时会造成时间和空间开销大,影响程序的运行效率
使用结构体指针作为参数传递时,因为传递的是地址,会比原本含有较多结构体的结构体变量更加块,但是也会造成结构体变量数据被修改的可能
#include<stdio.h>
#define N3;
struct student{
int num;
char name[20];
float score[3];
float aver;
};
void main()
{
void input(struct student stu[]);
struct student max(struct student stu[]);
void print(struct student stu);
struct student stu[N],*p=stu;
input (p);
printf(max(p));
}
void input (struct student stu[])
(
int i;
printf("请输入学生的信息\n");
for(i=0;i<N;i++){
scanf("%d%s%f%f%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i]score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
}}
struct student max(struct student stu[])
{
int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver)m=i;
return stu[m];
}
void print(struct student stu)
{
printf("学号:%d\n 姓名 :%d\n 三门成绩 :%5.1f%5.1f%5.1f\n 平均成绩 :%6.2\n",stu.num,stu.name stu.score[0],stu.score[1],stu.score[2],stu.aver");
printf("\n");
}