结构体的基础知识点
1.声明结构体:
struct 结构标识符{
数据类型 成员1的名字;
数据类型 成员2的名字;
};
结构模板只是声明了一种数据类型,定义了数据的组成形式,并未声明结构类型的变量
2.声明结构变量
(1).先声明结构类型,再定义结构变量
例如:利用前面已声明的结构类型struct student,定义一个该类型的变量stu;
struct student stu;
(2).在声明结构的同时定义结构变量
struct student {
char ID[16];
char name[16];
float score;
}stu;
3.初始化结构变量
struct student stu={“202410”,“阮”,‘M’,98};
4.将一个结构作为另一个结构的成员
struct date{
int year;
int month;
int day;
};
struct student{
char ID[16];
char name[16];
char sex;
struct date,birthday;
float score;
};
5.访问结构成员
一般情况:struct student stu;
stu.ID=“20242010”;
如果一个结构的成员又是另一个结构变量,必须以级联的方式访问结构成员
stu.birthday.year=2024;
stu.birthday.month=10;
例题:访问结构成员
#include<stdio.h>
struct date{
int year;
int month;
int day;
};
struct student{
char ID[16];
char name[16];
char sex;
struct date birthday;
float score;
};
int main()
{
struct student stu={"2010001","令狐冲",'M',{1990,5,23},98};
printf("学号:%s\n",stu.ID);
printf("姓名:%s\n",stu.name);
printf("性别:%c\n",stu.sex);
printf("生日:%d年%d月%d日\n",stu.birthday.year,stu.birthday.month,stu.birthday.day);
printf("成绩:%4.1f\n",stu.score);
}
6.使用typedef定义数据类型
关键字typedef用于为系统固有的或用户定义的数据类型定义一个别名
struct pts{
int x;
int y;
int z;
}
声明:
现在用关键字typedef为这个结构定义一个更方便引用的名字Point,语句如下:
tyoedef struct pts Point;
1.这条语句指定名称Point是struct pts的同义字。声明该结构变量是,可以这样写:
Point star_pt;
Point end_pt;
这里声明了两个结构变量
2.typedef struct pts{
int x;
int y;
int z;
}Point;
不要把这条声明和基本的结构声明弄混。这里的Pont不是结构变量的名称,而是类型名称,如果想要使用要声明变量
例题:输入n个学生信息,输出最高分的学生信息
#include<stdio.h>
/*读入学生的一些信息,然后找出成绩最高的学生的所有信息*/
typedef struct student//关键字typedef用于为系统固有的或者用户自定义的数据类型定义一个别名
{
char ID[16];
char name[16];
char sex;
float score;
}STUDENT;//这个不是结构体的名字
int main()
{
STUDENT stu,first;
int n,i;
printf("请输入学生人数:");
scanf("%d",&n);
first.score=-1;//把临时最优值的成绩初始化
printf("请输入%d个学生的信息(学号 姓名 性别 成绩):\n",n);
for(i=1;i<=n;i++)
{
scanf("%s",stu.ID);
scanf("%s",stu.name);
scanf("%*c%c",&stu.sex);//把空格筛掉,不要读入空格,用抑制符抑制掉
scanf("%f",&stu.score);
if(stu.score>first.score)
first=stu;//同类型结构变量可以直接赋值
}
printf("最高分学生的信息如下:\n");
printf("学号:%s\n",first.ID);
printf("姓名:%s\n",first.name);
printf("性别:%c\n",first.sex);
printf("成绩:%4.1f\n",first.score);
return 0;
}
7.结构数组
元素为结构类型的数组称为结构数组
声明:STUDENT stu[30];//STUDENT为结构类型,不是变量
可以进行初始化:STUDENT stu[30]={
{“20242010”,"阮“,‘M’,98},
{“20250210”,“宋”,‘M’,22}
};
8.结构指针
STUDENT *p;
指针使用前需要初始化;
例如:STUDENT stu={“20240120”,‘邵’,‘M’,18};
STUDENT *p=&stu;
访问形式:
结构指针变量名->成员名;
例如:通过不同方式访问结构成员
#include<stdio.h>
typedef struct student{
char ID[16];
char name[16];
char sex;
float score;
}STUDENT;
int main()
{
STUDENT stu={"20010001","令",'M',98};
STUDENT *p;
p=&stu;
//以下三种输出是等价的
printf("%s,%s,%c,%.1f\n",stu.ID,stu.name,stu.sex,stu.score);
printf("%s,%s,%c,%.1f\n",(*p).ID,(*p).name,(*p).sex,(*p).score);
printf("%s,%s,%c,%.1f\n",p->ID,p->name,p->sex,p->score);
return 0;
}
9.结构指针作为函数参数
例题:
#include<stdio.h>
struct date{
int year;
int month;
int day;
};
void pts(date *p)
{
p->year=2024;
p->month=12;
p->day=31;
}
int main()
{
date d;
pts(&d);
printf("%d-%d-%d",d.year,d.month,d.day);
return 0;
}
10.结构作为函数参数
例题:
#include<stdio.h>
struct date{
int year;
int month;
int day;
};
void DATE(date d){
printf("%d-%d-%d\n",d.year,d.month,d.day);
}
int main()
{
date p={2024,12,31};
DATE(p);
return 0;
}
结构变量作为函数参数有以下几个特点:
1.单向传递
2.在实参和形参之间复制所有结构成员的内容