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语言编程的知识。

相关推荐
Victor3561 小时前
Redis(104)Redis的最大数据量是多少?
后端
Victor3561 小时前
Redis(105)Redis的数据类型支持哪些操作?
后端
鬼火儿8 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin8 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧9 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧9 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧9 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧9 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧10 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧10 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端