为什么需要使用结构体:
在之前学习的数据类型中,有 int(整型),double , float(浮点型),char (字符型)
还有数组,字符串,然而,在定义这些数据时总是互不关联的,例如当我们需要记录学生的姓名,年龄,学号,成绩等时,需要将这些数据联系在一起,此时就需要用到结构体,将各个变量类型指向指向一个整体
一、申明结构体
1.单独定义:
先定义结构,再用结构定义结构变量
//格式
struct node{
int age,number,score; // 分别定义结构体中的年龄,学号,成绩
char name[101]; // 学生的姓名
}; //注意分号,此时也是一条语句
struct node st1;
/*
struct 结构名 结构变量名
*/
注意 :结构体中可以定义任何数据类型(int double float等),数组类型亦可,此外结构体中还可以再次定义结构体
2.混合定义
同时定义结构和结构变量
struct node{
int age,number,score; // 分别定义结构体中的年龄,学号,成绩
char name[101]; // 学生的姓名
}st1;
3.无类型名定义
省略结构名,直接定义结构变量
struct {
int age,number,score; // 分别定义结构体中的年龄,学号,成绩
char name[101]; // 学生的姓名
}st1;
二、结构变量的初始化和赋值
上述有说,结构体中还可以定义一个新的结构体,不妨将成绩分为语数英三种,定义结构体
struct node2{ //定义成绩的结构体
int chinese,math,english;
};
struct node { // 定义学生的结构体
int number,age;
char *name;
char gender[101];
struct node2 score;
};
int main()
{
struct node2 score1={120,120,130}; // 定义结构变量并赋值
struct node st1; // 定义结构变量
st1.number=10001;
st1.age=18;
st1.name='Jack'; // 指针字符串的赋值
strcpy(st1.gender,"male"); // 字符串的赋值
st1.score=score1; // 正常赋值相同
}
三、结构体的使用
1.用结构变量操作符,访问结构中的变量
//例如:访问结构变量中的学号,成绩
st1.number st1.score
2.结构变量可以作为函数的返回值
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
struct node2{
int chinese,math,english;
};
struct node {
int number,age;
char name[101];
char gender[101];
struct node2 score;
};
struct node newstu(char *name,char *gender,int age,struct node2 score2)
{
struct node st2;
st2.age=age;
st2.score=score2;
strcpy(st2.gender,gender);
strcpy(st2.name,name);
return st2;
}
int main()
{
struct node2 score1;
struct node st1,st3;
scanf("%d%d%d",&score1.chinese,&score1.math,&score1.english); // 输入结构体score
scanf("%d%d%s%p",&st1.number,&st1.age,st1.name,st1.gender); // 输入结构体st1
st3=newstu(st1.name,st1.gender,st1.age,score1); // 将st1的结构体赋值到st3中
printf("%d %s %d %d %d %s",st3.age,st3.name,st3.score.chinese,st3.score.math,st3.score.english,st1.gender);
system("pause");
return 0;
}
四.结构数组
同一结构类型的变量组成的数组(本质和其他类型数组相同,只是多了结构)
struct node a[1001]; // struct 结构名 数组名
关于结构数组的使用:
访问结构数组的变量 (和结构变量对比)
例如:定义两种类型(结构数组与结构变量)
struct score {
int math,chinese,english;
};struct score student[10]; struct score student;
student[0].math; student.math;
student[0].chinese; student.chinese;
student[0].english; student.english;
五.结构指针
概念:指向结构类型变量的指针
struct score student;
struct score *sp;
sp=&student; // sp指向student struct 结构名 *结构指针变量名
结构指针间接访问结构变量
①用间接访问符 * : (*sp).chinese=100;
②用指针运算符 -> : sp->chinese=100;
结构指针作为函数参数:传递结构指针可以改变结构中的变量的值
#include<stdlib.h>
#include<malloc.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
struct node
{
int chinese,english,math; //结构内变量名
};
struct node st1;
void change(struct node *st) // 传递结构指针改变变量
{
int a=(*st).chinese;
(*st).chinese=(*st).english;
(*st).english=(*st).math;
(*st).math=a;
}
int main()
{
scanf("%d%d%d",&st1.chinese,&st1.english,&st1.math);
struct node *sp;
sp=&st1;
change(sp);
printf("%d %d %d",st1.chinese,st1.english,st1.math);
system("pause");
return 0;
}
六.其他类型
1.typedef 用于结构
typedef struct score
{
int math,chinese,english;
}score; // 随后就可以使用 student 作为类型名,声明结构变量
score stu1; // 注意与 struct score stu1; 的区别
2.联合 (union)
用法和 struct 类似 ,区别在于 union 的所有成员共享内存开始地址 (首地址相同)
union 联合名
{
成员1;
成员2;
};
3.枚举 (enum)
enum 枚举名
{
成员1; // 一组 int 型常量的集合,成员1默认值为0 之后成员依次累计+1
成员2; // 如果某个成员被赋予特定值,则之后的成员从特定值+1
};
关于使用:
enum Day{ Mon,Tue,Wed,Thu,Fri,Sat,Sun}; // 值分别为0 1 2 3 4 5 6
// enum Day{ Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}; 值分别为 1 2 3 4 5 6 7
// enum Day{ Mon,Tue=2,Wed,Thu,Fri,Sat,Sun}; 值分别为 0 2 3 4 5 6 7
int main()
{
enum Day day;
day=Thu; printf("%d",day); //输出为3
return 0;
}