C语言中的结构体

简介: C语言中的结构体

在C语言中,结构体(struct)是一种可以封装多个不同类型数据的数据结构。通过使用结构体,我们可以将多个相关的变量组合成一个单一的实体,从而方便地进行管理和操作。在本篇博客中,我们将通过示例代码来详细探讨C语言结构体的使用。

1. 定义结构体

首先,我们需要定义一个结构体类型。在示例代码中,我们定义了一个名为Student的结构体,用于表示学生的信息。该结构体包含三个成员:id(学生ID)、age(学生年龄)和name(学生姓名)。

struct Student {
    int id;         // 学生ID
    int age;        // 学生年龄
    char *name;     // 学生姓名
};

2. 初始化结构体

在C语言中,我们可以通过多种方式初始化结构体。示例代码中展示了三种初始化方法:

  • 完全初始化:为所有成员提供初始值。
struct Student stu1 = {1, 23, "ZhangSan"};


  • 部分初始化:只为部分成员提供初始值,剩余成员将自动初始化为0或NULL(对于指针类型)。
struct Student stu2 = {1, 23};
struct Student stu3 = {.name = "wangwu"};

3. 访问结构体成员

结构体成员的访问通过点操作符(.)实现。我们可以使用结构体变量名后跟点操作符和成员名来访问特定成员。

printf("stu1: ID=%d, Age=%d, Name=%s\n", stu1.id, stu1.age, stu1.name);

4. 结构体作为函数参数

结构体可以作为函数的参数进行传递。在示例代码中,我们定义了两个测试函数testtest2,用于修改学生年龄。这两个函数分别通过值传递和指针传递接收结构体参数。

  • 值传递:在test函数中,我们通过值传递接收结构体参数。这意味着函数将接收到结构体的一个副本,对副本的修改不会影响原始结构体。
void test(struct Student stu) {
    stu.age = 66; // 此处仅修改局部变量stu的age
}
  • 指针传递:在test2函数中,我们通过指针传递接收结构体参数。这意味着函数将接收到指向原始结构体的指针,对指针指向内容的修改将影响原始结构体。
void test2(struct Student *stu) {
    stu->age = 66; // 修改指针指向的学生结构体的age
}

5. 结构体数组和指针

我们还可以定义结构体数组和结构体指针。示例代码中展示了如何定义和初始化一个学生结构体数组,以及如何使用结构体指针访问结构体成员。

struct Student arrStu[] = {{1, 18, "小明"},
                           {2, 28, "小红"},
                           {3, 19, "小刚"}};

struct Student student = {1, 18, "小明"};
struct Student *p = &student;
printf("Name via pointer: %s\n", (*p).name); // 输出: Name via pointer: 小明
printf("Name via arrow: %s\n", p->name);     // 输出: Name via arrow: 小明

总结

C语言中的结构体是一种强大的数据结构,它允许我们将多个相关的变量组合成一个单一的实体。通过结构体,我们可以更方便地管理和操作这些数据。本篇博客通过示例代码详细探讨了C语言结构体的定义、初始化、成员访问以及作为函数参数传递等方面的知识。希望这些内容能帮助读者更好地理解和应用C语言结构体。

目录
相关文章
|
6天前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
26 7
|
4天前
|
网络协议 编译器 Linux
结构体(C语言)
结构体(C语言)
|
15天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
30 7
|
16天前
|
编译器 C语言
【C语言基础】:自定义类型(一)--> 结构体-2
【C语言基础】:自定义类型(一)--> 结构体
|
16天前
|
编译器 Linux C语言
【C语言基础】:自定义类型(一)--> 结构体-1
【C语言基础】:自定义类型(一)--> 结构体
|
24天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
20 3
|
24天前
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
24 2
|
24天前
|
编译器 Linux C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
23 1
|
25天前
|
编译器 C语言
C语言深度理解之——结构体内存对齐
C语言深度理解之——结构体内存对齐
19 1
|
5天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
8 0