C语言 结构体(Struct)详解及示例代码

C语言 结构体(Struct)详解及示例代码

什么是结构体(struct)?

结构体是C语言中一种构造类型(Compound Type),它可以将多个不同类型的变量组合成一个整体,方便在程序中进行操作。

一个结构体可以包含任意数量的成员变量,每个成员变量可以是基本类型,也可以是其他结构体类型。结构体定义语法如下:

struct 结构体名称 {
    数据类型 成员变量1;
    数据类型 成员变量2;
    // ...
    数据类型 成员变量n;
};

在定义结构体时,我们需要指定结构体的名称,并列举其中的成员变量及其类型。这些成员变量的定义方式和声明普通变量的方式相同。

如何使用结构体?

定义好结构体之后,我们可以声明一个或多个该类型的变量,并使用.运算符来访问其中的成员变量。例如:

#include <stdio.h>

struct Student {
    char name[20];
    int age;
    float score;
};

int main() {
    struct Student stu1 = {"Alice", 18, 90.5}; // 初始化结构体变量
    struct Student stu2; // 声明结构体变量

    stu2 = stu1; // 结构体变量之间可以直接赋值
    printf("%s的年龄是%d,成绩是%.1f\n", stu1.name, stu1.age, stu1.score);
    printf("%s的年龄是%d,成绩是%.1f\n", stu2.name, stu2.age, stu2.score);

    stu2.age = 19; // 可以单独修改结构体中的某个成员变量
    printf("%s的年龄是%d\n", stu2.name, stu2.age);

    return 0;
}

在上面的代码中,我们定义了一个Student结构体,包含名字、年龄和成绩三个成员变量。在main函数中,我们声明了两个该类型的变量stu1stu2。我们使用了初始化的方式为stu1变量的成员变量赋值,然后使用赋值操作符将stu1的值赋给stu2,这说明结构体变量之间完全可以实现赋值操作。

我们使用.运算符可以访问结构体变量中的每一个成员变量。例如,在上面的代码中,使用stu1.name可以获取stu1变量的名字属性,使用stu2.age可以获取stu2变量的年龄属性。我们还可以通过单独修改某个成员变量来修改结构体中的数据。

结构体示例1:计算图形面积

下面通过一个示例来说明如何使用结构体计算图形的面积。

首先,我们定义表示三角形、矩形和圆形的结构体:

struct Triangle {
    float bottom;
    float height;
};

struct Rectangle {
    float width;
    float height;
};

struct Circle {
    float radius;
};

然后,我们编写计算这些图形面积的函数:

#define PI 3.14159

float calcTriangleArea(struct Triangle t) {
    return t.bottom * t.height / 2;
}

float calcRectangleArea(struct Rectangle r) {
    return r.width * r.height;
}

float calcCircleArea(struct Circle c) {
    return PI * c.radius * c.radius;
}

这里我们分别定义了三个计算面积的函数,分别接收一个TriangleRectangleCircle类型的参数,返回对应图形的面积。

最后我们在主函数中可以这样调用这些函数:

int main() {
    struct Triangle t = {3, 4};
    struct Rectangle r = {5, 6};
    struct Circle c = {2};

    printf("三角形的面积是%.2f\n", calcTriangleArea(t));
    printf("矩形的面积是%.2f\n", calcRectangleArea(r));
    printf("圆形的面积是%.2f\n", calcCircleArea(c));

    return 0;
}

在这段代码中,我们声明了三个图形变量trc,并传递给上面定义的三个函数进行面积计算。

结构体示例2:分离整数的小数部分和整数部分

下面我们通过一个示例来说明如何使用结构体将一个实数分解成小数部分和整数部分。

首先,我们定义一个名为Number的结构体:

struct Number {
    int integerPart;
    int decimalPart;
};

然后,我们编写一个接收一个实数参数,将其分解成整数部分和小数部分,放入Number结构体中返回的函数:

struct Number splitNumber(float num) {
    struct Number result;
    result.integerPart = (int)num;
    result.decimalPart = (int)((num - result.integerPart) * 100);

    return result;
}

在这个函数中,我们首先定义了一个名为resultNumber类型的变量。然后,我们先通过强制类型转换获取该实数的整数部分,将其存入integerPart成员变量中。接着,我们将实数减去整数部分,就可以获得小数部分,这里我们将其乘以100并强制转化为int类型后再将其存入decimalPart成员变量中。最后,我们将result返回。

我们在主函数中可以这样调用这个函数:

int main() {
    struct Number n = splitNumber(3.14159);
    printf("3.14159的整数部分是%d,小数部分是%d\n", n.integerPart, n.decimalPart);

    return 0;
}

我们传入一个实数3.14159来调用splitNumber函数,可以得到返回值中的整数部分是3,小数部分是14。

结束语

通过上面的示例,我们可以看到结构体在C语言中的强大之处,可以将不同类型的变量组合成一个整体是非常方便的。但需要注意的是,结构体的创建时需要预留足够的内存空间,不然会导致内存溢出,所以使用时需要谨慎一些。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 结构体(Struct)详解及示例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • 浅析C++内存布局

    浅析C++内存布局 C++是一门面向过程的编程语言,与其他编程语言一样,C++也有自己的内存布局。 内存布局基本概念 堆 使用new或malloc操作后存放动态分配的数据的区域。 栈 用于存放程序运行时的函数栈帧,栈帧将在函数执行完后自行清除。 全局变量区 在程序运行前就分配好的存放全局变量的区域,该区域分为静态区和可读写区。 常量区 存放程序中常量的区域,…

    C 2023年5月22日
    00
  • ajax实现动态下拉框示例

    讲解“ajax实现动态下拉框示例”的完整攻略如下: 一、什么是ajax Ajax 是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。它通过与服务器进行异步数据交互,无需重载整个页面就能够更新部分页面的数据。 二、ajax实现动态下拉框示例 1. 前端页面 首先,在HTML页面的<head>标签中引入jQuery库。然后,在HTML页面…

    C 2023年5月23日
    00
  • 一文搞懂C++中继承的概念与使用

    一文搞懂C++中继承的概念与使用 1. 继承的概念 继承是指在定义一个类时,可以在新的类中直接引用一个已有的父类的属性和行为,新的类称为子类或派生类,已有的类称为父类或基类。 子类会继承父类的公有成员和保护成员,但不会继承父类的私有成员。同时子类可以访问父类的公有成员和保护成员,但无法访问私有成员。 2. 继承的语法 继承语法如下所示: class Chil…

    C 2023年5月22日
    00
  • 如何解决UnsupportedOperationException异常问题

    针对UnsupportedOperationException异常问题,可以按照以下步骤来解决: 步骤一:确定异常类型 首先找到程序出现问题的那行代码,查看控制台输出的异常信息,看看异常类型是什么,比如说是UnsupportedOperationException。 Exception in thread "main" java.lang…

    C 2023年5月23日
    00
  • json对象及数组键值的深度大小写转换问题详解

    标题:JSON对象及数组键值的深度大小写转换问题详解 问题描述 在JavaScript中,使用JSON对象表示数据是一种常见的方式。但JSON对象在不同的语言和系统间传递时,往往要面临大小写转换的问题。这里主要讲述的是JSON对象及数组键值的大小写转换问题。 解决方案 1. 下划线转驼峰 将JSON对象中的下划线表示的键名转换为驼峰式表示的键名: funct…

    C 2023年5月23日
    00
  • Golang中的错误处理深入分析

    Golang中的错误处理深入分析 Golang是一门支持错误处理的语言,它提供了一系列的处理错误的方式。在本篇文章中,我们将深入分析Golang中的错误处理。 简介 在Golang中,错误类型是一个内置类型,它实现了Error接口。Error接口只有一个方法,即Error() string,它返回错误的描述字符串。一般来说,一个函数要么返回一个值,要么返回一…

    C 2023年5月22日
    00
  • C语言实现小学生计算机辅助教学系统

    C语言实现小学生计算机辅助教学系统攻略 目标 本攻略将指导您如何使用C语言编写一个小学生计算机辅助教学系统,该教学系统可以帮助小学生进行加减乘除练习,并评估他们的表现。 步骤 设计用户界面 首先,您需要设计一个用户界面。您可以使用如下的代码块来创建用户界面。该用户界面将会展示程序的功能菜单和用户可以选择的操作。在此示例中,我们提供了四个选项,分别对应加、减、…

    C 2023年5月30日
    00
  • C 程序 八进制转换为二进制

    让我来为您详细介绍C程序如何将八进制转换为二进制。 1. 简介 如何将八进制转换为二进制这个问题,实际上是一个将任意进制的数转换为另一种进制的问题,只不过这里以八进制和二进制转换为例子来说明。要将八进制数转换为二进制,我们需要将八进制数的每一位先转换为二进制,再将每个二进制数位连接起来,最终得到二进制数。 2. 具体步骤 具体的转换步骤如下: 将每个八进制位…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部