一、结构体概念
在C语言中,结构体(struct
)是一种用户自定义的数据类型,允许你将不同类型的数据项组合成一个单一的类型。结构体常用于表示具有多个属性的复杂数据,比如一个学生的信息(包括姓名、年龄、成绩等)或者一个产品的信息(包括产品ID、名称、价格等)。
//例子:定义一个学生
//结构成员的类型:结构的成员可以是标量、数组、指针,甚至是其他结构体
struct Stu
{
//成员变量
char name[10]; //名字
int age; //年龄
char id[20]; //学号
}; s1, s2; //s1和s2也是结构体变量(全局变量)
int main()
{
//s是局部变量
struct Stu s; //对象
return 0;
}
二、结构体变量的定义和初始化
定义:定义一个结构体。这通过struct
关键字后跟结构体标签(或称为名称)和结构体成员列表(用花括号包围,成员之间用分号分隔)来完成。
初始化:给结构变量赋值
struct Stu
{
//成员变量
char name[10]; //名字
int age; //年龄
char id[20]; //学号
}; s1, s2; //s1和s2也是结构体变量(全局变量)
int main()
{
//s是局部变量
struct Stu s = {"张三", 30, "2204210"}; //结构体初始化
return 0;
}
三、结构体成员的访问
在C语言中,结构体成员的访问是通过结构体变量和点操作符(.
)或箭头操作符(->
,当结构体是通过指针访问时)来完成的。
//结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
struct Stu
{
//成员变量
char name[10]; //名字
int age; //年龄
char id[20]; //学号
}; s1, s2; //s1和s2也是结构体变量(全局变量)
int main()
{
//s是局部变量
struct Stu s = {"ZHANGSAN", 30, "2204210"}; //结构体初始化
//printf("%s\n", s.name); //访问方式1
//printf("%d\n", s.age);
//printf("%s\n", s.id);
struct Stu* ps = &s;
printf("%s\n", (*ps).id);
printf("%s\n", ps->id); //访问方式2
return 0;
}
四、结构体传参
在C语言中,当你想通过函数来操作或处理结构体数据时,你需要将结构体变量或结构体变量的地址作为参数传递给函数。结构体传参主要有两种方式:按值传递(传递结构体变量的副本)和按地址传递(传递指向结构体变量的指针)。
(1)按值传参:按值传递时,函数接收的是结构体变量的一个副本。这意味着函数内部对结构体所做的任何修改都不会影响到原始的结构体变量。由于结构体可能包含大量的数据,按值传递可能会导致大量的数据复制,从而降低程序的效率。
(2)按址传参:按地址传递时,函数接收的是指向结构体变量的指针。这意味着函数内部对结构体所做的任何修改都会直接反映到原始的结构体变量上。由于只是传递了地址(即一个指针),而不是整个结构体,因此这种方式更加高效,尤其是对于大型结构体。
struct Stu
{
//成员变量
char name[20]; //名字
int age; //年龄
char id[20]; //学号
};
void print1(struct Stu t)
{
printf("%s %d %s\n", t.name, t.age, t.id);
}
void print2(struct Stu* ps)
{
printf("%s %d %s\n", ps->name, ps->age, ps->id);
}
int main()
{
//s是局部变量
struct Stu s = { "张三", 30, "2204210" }; //结构体初始化
//写一个函数打印s的内容
print1(s); //传值调用
print2(&s); //传址调用
return 0;
}