- 学习参考B站郝斌老师的视频,文章内的源码如有需要可以私信联系。
结构体
- 为了表达一些复杂的事物,而普通的基本类型无法满足实际需求
- 把一些基本数据组合在一起,形成的一个新的复合数据类型,叫结构体
例:结构体举例
/*结构体*/
# include <stdio.h>
struct Student //定义结构体,由基本的变量构成
{
int age;
int score;
char sex;
};
int main(void)
{
struct Student st = {20, 85, 'M'}; //定义结构体变量
return 0;
}
例:定义结构体的方式
/*定义结构体*/
//第一种方式,推荐使用的方式
struct Student //只是定义了新的数据类型,并没有定义变量
{
int age;
int score;
char sex;
};
//第二种方式
struct Student
{
int age;
int score;
char sex;
}st;
//第三种方式
struct
{
int age;
int score;
char sex;
}st;
结构体变量的使用
- 赋值和初始化
- 定义的同时可以整体赋初始值
- 定义完后,只能单个的赋初始值
- 取出结构体变量中的每一个成员
结构体.成员名
指针变量名->成员名
- 结构体变量的运算
- 结构体变量可以互相赋值,但是不能相加减,相乘除
例:结构体变量的赋值和初始化
/*结构体变量的赋值和初始化*/
# include <stdio.h>
struct Student
{
int age;
int score;
char sex;
};
int main(void)
{
struct Student st = {20, 85, 'M'}; //定义变量时赋值
struct Student st2; //定义完成后再赋值
st2.age = 20;
st2.score = 85;
st2.sex = 'M';
printf("%d %d %c
", st2.age, st2.score, st2.sex);
return 0;
}
/*运行结果*/
20 85 M
Press any key to continue
例:结构体中成员变量的取出
/*结构体中成员变量的取出*/
# include <stdio.h>
struct Student
{
int age;
int score;
char sex;
}; //分号不能省略
int main(void)
{
struct Student st = {20, 85, 'M'};
struct Student * pst = &st; //定义指针变量pst时存放结构体地址的
pst->age = 25; //在计算机内部会被转化为(*st).age
st.age = 25;
printf("%d %d %c
", st.age, pst->score, st.sex);
return 0;
}
pst->age
等价于(*pst).age
也等价于st.age
pst->age
表示指针变量pst指向的结构体中的age这个成员变量
/*运行结果*/
25 85 M
Press any key to continue
例:通过函数完成对结构体变量的输入和输出
/*通过函数完成对结构体变量的输入和输出*/
# include <stdio.h>
# include <string.h> //使用strcpy需要定义头文件
struct Student
{
int age;
char sex;
char name[50];
};
void InputStudent(struct Student stu);
int main(void)
{
struct Student st;
InputStudent(st);
printf("%d %c %s
", st.age, st.sex, st.name);
return 0;
}
//此函数不能修改主函数中st的值
void InputStudent(struct Student stu)
{
stu.age = 10;
strcpy(stu.name, "Bad"); //对字符串的处理必须使用strcpy,不能直接使用stu.name='Bad'
stu.sex = 'M';
}
- 程序中,将变量st的值发送给stu,在定义的函数内,改变的是stu中的成员变量,当函数执行结束后,变量stu的存储空间被释放,不会修改主函数中st的值
- 即形参与实参的改变不互相影响
- 结构体中的成员变量都没有初始化,所以会使用垃圾数据填充,字符串知道读取到