【数据结构】C语言结构体详解

简介: 【数据结构】C语言结构体详解


前言

结构体是C语言中一种自定义的数据类型,它允许开发者将不同类型的数据组合在一起,形成一个更复杂的数据结构,提高程序的灵活性和扩展性。本文将详细介绍C语言中结构体的基本概念、定义和使用方法,希望能够帮助读者更好地理解和应用结构体。


一、结构体的定义

在C语言中,结构体是一种用户自定义的数据类型,它允许我们将不同的数据类型组合在一起,创建一个具有自定义属性的复合数据类型。

结构体可以通过下面的语法进行定义:

struct <结构体名>
{
  <成员1的数据类型> <成员1的名称>;
  <成员2的数据类型> <成员2的名称>;
  // ...
  <成员N的数据类型> <成员N的名称>;
};

例如,下面的代码定义了一个名为 Person 的结构体,其中包含了姓名、年龄和身高三个成员:

struct Person
{
  char name[50];
  int age;
  double height;
};

这个结构体可以用来描述一个人的基本信息。可以通过下面的语句来定义 Person 的一个实例:

struct Person person1; // 定义一个名为 person1 的 Person 类型的变量

然后就可以通过 . 运算符来访问结构体的成员,例如:

strcpy(person1.name, "Filotimo");
person1.age = 20;
person1.height = 1.80;

完整代码:

#include <stdio.h>
#include <string.h>
struct Person
{
  char name[50];
  int age;
  double height;
};
int main()
{
  struct Person person1;
  strcpy(person1.name, "Filotimo");
  person1.age = 20;
  person1.height = 1.80;
  printf("Person's name: %s\n", person1.name);
  printf("Person's age: %d\n", person1.age);
  printf("Person's height: %.2f\n", person1.height);
  return 0;
}

输出结果如下:

二、定义结构体变量

定义结构体变量的一般语法为:

struct 结构体名称 变量名称;

例如,定义一个包含姓名和年龄两个成员的结构体变量person可以这样写:

struct person {
    char name[20];
    int age;
} p;

上述代码用p作为person类型的结构体变量。我们可以通过访问p的成员来使用这些数据。

三、结构体变量的初始化

结构体变量初始化的示例代码:

struct person {
    char name[20];
    int age;
};
int main() {
    //一般初始化方法
    struct person p1 = {"小明", 18};
    //成员初始化
    struct person p2;
    strcpy(p2.name, "小红");
    p2.age = 20;
    return 0;
}

在p1的初始化中,我们直接使用花括号给出name和age的初始值;在p2的初始化中,我们分别对name和age进行了单独的初始化。

四、使用typedef声明新数据类型名

一般形式的typedef类型定义语句如下:

typedef existing_type new_type;

existing_type 是已经存在的数据类型,可以是基本类型(如 int、float、char 等),也可以是结构体、枚举等自定义类型;new_type 是你要定义的新的数据类型名。

以下是两个例子:

1.定义一个新的数据类型名,将 int 重命名为 Integer:

typedef int Integer;

2.定义一个新的数据类型名,将结构体重命名为 Student:

typedef struct {
    int id;
    char name[128];
    int age;
} Student;

五、指向结构体变量的指针

要声明一个指向结构体变量的指针,你可以使用结构体的类型作为指针的基类型,并在声明时使用星号(*)来表示这是一个指针。例如,假设有一个名为Person的结构体,包含name和age字段:

struct Person {
    char name[50];
    int age;
};

你可以声明一个指向Person结构体的指针如下:

struct Person *personPtr;

接下来,你可以通过结构体变量的地址来初始化指针变量,例如:

struct Person person;
personPtr = &person;

现在,personPtr指针指向了person结构体变量在内存中的位置。通过指针,你可以通过箭头运算符(->)来访问和修改结构体中的字段。例如,你可以使用以下语法来访问和修改name和age字段:

strcpy(personPtr->name, "Filotimo");
personPtr->age = 20;

这样就可以在不直接引用结构体变量的情况下,通过指针来操作结构体的字段了。

完整代码:

#include <stdio.h>
#include <string.h>
struct Person {
    char name[50];
    int age;
};
int main() {
    struct Person person;
    struct Person *personPtr;
    personPtr = &person;
    strcpy(personPtr->name, "Filotimo");
    personPtr->age = 20;
    printf("Name: %s\n", personPtr->name);
    printf("Age: %d\n", personPtr->age);
    return 0;
}

输出结果如下:


总结

结构体在C语言中扮演着重要的角色,它不仅可以提高程序的效率和可扩展性,还可以使代码更加模块化和易于理解。希望读者通过本文的学习,能够更加熟练地运用结构体来解决实际问题,提高自己的编程水平。

目录
相关文章
|
26天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
122 9
|
2月前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
69 4
|
12天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
37 4
|
25天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
63 16
|
25天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
82 8
|
28天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
54 4
|
2月前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
45 10
|
29天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
60 3
|
29天前
|
存储 算法 C语言
C语言数据结构(2)
【10月更文挑战第21天】
|
2月前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。