希和2027头像
关注

c语言学习笔记-结构体

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--