1. 引言:为什么需要结构体
在 C 语言中,数组只能存放同类型的数据,而现实中的实体(如学生、商品、订单)往往由多种不同类型的属性组成。结构体(struct)正是为此而生——它允许我们把不同类型的数据组合成一个自定义类型,让代码更贴近真实世界,也更易维护。
本文通过一个「学生信息管理」的完整示例,带你掌握结构体的定义、变量声明、成员访问(点运算与箭头运算)以及结构体指针传参等核心用法。
2. 结构体的定义与变量声明
结构体使用 struct 关键字定义,语法如下:
struct 结构体名
{
成员类型 成员名;
// ...
}变量名;
其中 struct Stu 是结构体类型名,而 s1、p 是声明的结构体变量(非类型名)。定义结构体时,可以同时声明变量,也可以先定义类型、后声明变量。
3. 结构体变量的初始化与赋值
结构体变量可以在声明时直接初始化,也可以先声明再整体赋值:
struct Stu s = {"zhangsan", 20, "nan", "132222213243"};
s1 = s; // 结构体变量之间可以直接整体赋值
注意:结构体变量之间可以直接用 = 赋值,这是数组做不到的。
4. 成员访问:点运算与箭头运算
访问结构体成员有两种方式:
- 点运算(
.):通过结构体变量访问成员,如s.name。 - 箭头运算(
->):通过结构体指针访问成员,如p->name。
两者在指针场景下等价:p->name 等价于 (*p).name。下面的代码演示了两种方式的等价性:
printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
printf("%s %d %s %s\n", (*p).name, (*p).age, (*p).sex, (*p).tele);
printf("%s %d %s %s\n", p->name, p->age, p->sex, p->tele);
5. 结构体指针传参
把结构体指针传给函数,可以避免整个结构体的拷贝,提高效率。函数内既可以用 (*a).成员,也可以用 a->成员 访问:
void print(struct Stu* a)
{
printf("%s %d %s %s\n", (*a).name, (*a).age, (*a).sex, (*a).tele);
printf("%s %d %s %s\n", a->name, a->age, a->sex, a->tele);
}
调用时传入结构体变量的地址即可:print(&s);。
6. 完整示例代码
把以上知识点整合成一个可运行的程序:
#include <stdio.h>
// struct 结构体关键字
// struct Stu 结构体类型名定义
// s1 声明结构体变量,非类型名
struct Stu
{
char name[20]; // 内部成员结构体
int age;
char sex[10];
char tele[12];
} s1, *p;
void print(struct Stu* a) // 结构体变量调用和指针类似
{
printf("%s %d %s %s\n", (*a).name, (*a).age, (*a).sex, (*a).tele);
printf("%s %d %s %s\n", a->name, a->age, a->sex, a->tele);
}
int main()
{
p = &s1;
struct Stu s = {"zhangsan", 20, "nan", "132222213243"};
s1 = s;
// 结构体变量 s,结构体变量.成员,点运算
printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
printf("%s %d %s %s\n", s1.name, s1.age, s1.sex, s1.tele);
printf("%s %d %s %s\n", (*p).name, (*p).age, (*p).sex, (*p).tele);
printf("%s %d %s %s\n", p->name, p->age, p->sex, p->tele);
print(&s);
// printf("%s %d %s %s\n", &s1->name, &s1->age, &s1->sex, &s1->tele); // 语法错误
// int *p *p 数值变量,p 地址
return 0;
}
7. 常见避坑指南
- 不要对结构体变量使用
->:s->name是语法错误,->只能用于指针。 - 不要对指针使用
.:p.name也是错误的,指针必须用->或先解引用(*p).name。 - 结构体可以整体赋值:
s1 = s;合法,但数组不能这样整体赋值。 - 传参优先用指针:结构体较大时,值传递会拷贝整个结构体,用指针更高效。
8. 总结
结构体是 C 语言组织复杂数据的核心工具。掌握 struct 定义、变量声明、点运算与箭头运算的区别,以及指针传参的写法,就能写出结构清晰、可维护的 C 程序。建议你亲手运行上面的完整示例,并尝试修改成员值、增加新成员来加深理解。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2301_81429079/article/details/167223059



