C语言中的结构体:从定义到传递

前言

结构体是C语言中一种重要的数据类型,它允许我们将不同类型的数据组合成一个整体,并以自定义的方式进行操作。通过结构体,我们可以更加灵活地管理和处理复杂的数据结构,从而提高程序的可读性和可维护性。本篇博客将从结构体的定义开始,逐步介绍其在C语言中的应用,包括结构体变量的定义和初始化、结构体成员的访问、结构体作为函数参数的传递等内容,帮助读者深入理解C语言中结构体的核心概念和用法。接下来我们来详细解释一下

概述

  • 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性
    • 这时候可通过结构体实现
  • 结构体(struct)可以理解为用户自定义的特殊的复合的"数据类型"

结构体变量的定义和初始化

  • 定义结构体变量的方式:
    • 先声明结构体类型再定义变量名
    • 在声明类型的同时定义变量
  • 语法格式:
C 复制代码
// 先声明结构体类型再定义变量名
struct 结构体名 {
    成员列表
};
struct 结构体名 变量名;

// 在声明类型的同时定义变量
struct 结构体名 {
    成员列表
}变量名;
  • 示例代码:
C 复制代码
// 结构体类型的定义
struct stu {
	char name[50];
	int age;
};

// 先定义类型,再定义变量(常用)
struct stu s1 = {"mike", 18};

// 定义类型同时定义变量
struct stu2 {
	char name[50];
	int age;
}s2 = {"yoyo", 19};

结构体成员的使用

  • 如果是结构体变量,通过 . 操作成员
  • 如果是结构体指针变量,通过 -> 操作成功
C 复制代码
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

int main() {
    // 定义结构体变量,同时初始化
    struct stu s = {"mike", 18};
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);
    // 修改成功变量的内容
    strcpy(s.name, "yoyo");
    s.age = 19;
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);

    return 0;
}

结构体做函数参数

结构体值传参

  • 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

示例代码:

C 复制代码
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu temp) {
    strcpy(temp.name, "yoyo");
    temp.age = 20;
    printf("函数内部:%s, %d\n", temp.name, temp.age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,值传递
    func(s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

复制代码
函数内部:yoyo, 20
函数外部:mike, 18

结构体地址传递

  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

C 复制代码
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu *p) {
    strcpy(p->name, "yoyo");
    p->age = 20;
    printf("函数内部:%s, %d\n", p->name, p->age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,地址传递
    func(&s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

复制代码
函数内部:yoyo, 20
函数外部:yoyo, 20

接下来我们来写一个小案例练习

题目:定义一个结构体Person,包含人的姓名和年龄两个成员变量。编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。

代码示例:

C 复制代码
#include <stdio.h>
#include <string.h>

struct Person {          // Person是结构体名
    char name[20];
    int age;
};
struct Person person[3] = {         // person[3]是结构体数组
    {"喜羊羊", 22},     // 结构元素
    {"懒羊羊", 23},
    {"沸羊羊", 25}
};
int main() {
    // 定义一个结构体Person,包含人的姓名和年龄两个成员变量。编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。
    for(int i = 0; i < 3; i++){
        printf("姓名:%s,年龄:%d\n", person[i].name, person[i].age);
    }
 return 0;
}

总结

通过本篇博客,我们了解了C语言中结构体的重要性以及如何运用它来组织和管理数据。结构体不仅是一种数据类型,更是程序设计中的重要工具,能够帮助我们处理各种复杂的数据结构,实现更加高效、清晰的代码。希望本文能够对读者在学习和使用C语言时有所帮助,也欢迎大家分享自己对结构体的理解和应用经验,共同探讨C语言编程的知识。

相关推荐
神奇小汤圆3 分钟前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
文艺理科生12 分钟前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling13 分钟前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅14 分钟前
springBoot项目有几个端口
java·spring boot·后端
Luke君6079716 分钟前
Spring Flux方法总结
后端
define952720 分钟前
高版本 MySQL 驱动的 DNS 陷阱
后端
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶2 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
Java后端的Ai之路2 小时前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway