结构体
为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
什么叫结构体
把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体
如何定义结构体
struct Student{
int age;
char name[20];
float score;
}; //最后的分号不能省
struct Student2{
int age;
char name[20];
float score;
}str2; //定义结构体的同时定义变量,变量名为str2,数据类型为struct Student2
struct {
int age;
char name[20];
float score;
}str; //没有给出结构体名称,直接定义变量
赋值和初始化
定义的同时可以整体赋初始值
struct Student{
int age;
char name[20];
float score;
};
struct Student st= {20,"zhangsan",55.5};
//每一个数据都要与结构体中的成员数据相对应
struct Student2{
int age;
char name[20];
float score;
}str2 = {20,"zhangsan",55.5};
定义完之后只能单个赋初始值
需单独取出每一个成员进行赋值
如何取出结构体变量中的每一个成员
-
结构体变量名.成员名
-
指针变量名->成员名(更常用)
指针变量名->成员名 在计算机内部会被转化成 (*指针变量名).成员名 来执行
所以这两种方法是等价的
struct Student{
int age;
char name[20];
float score;
};
int main(void){
struct Student st= {20,"zhangsan",55.5};//初始化同时赋初始值
//定义后单独赋值
struct Student * pst = &st;//结构体指针
struct Student = {20,"zhangsan",55.5};
st.age = 20;//第一种方式
pst->age = 20;//第二种方式
//pst->age 会被转化成 (*pst).age,也就等价于st.age
return 0;
}
结构体作为函数参数
-
使用结构体变量作为函数参数
采用 值传递 方式,即将结构体变量所占的内存单元的内从全部顺序传递给形参
void f(struct Student stu){
}
调用函数期间,形参也要占内存单元,在空间和时间上开销都比较大
而且值传递方式,如果在函数内修改了变量中成员的值,改变的值不会返回到主调函数中、
-
使用结构体指针作为函数参数
只将结构体变量的首地址进行传递,减少内存占用,
如果在函数中改变成员变量的值,也会返回到主调函数中,
void f(struct Student * stu){
}
推荐使用结构体指针变量作为函数参数来传递
结构体变量的运算
结构体变量不能相加、相减,乘除;
可以进行相互赋值
struct Student{
int age;
char name[20];
float score;
};
struct Student str,str2;
str1 + str2 str1*str2 str1/str2 //都是错误的
str1 = str2 或 str2 = str1;//都是正确的