C 语言基础教程(我的C之旅开始了)[五]

下面详细讲解“C语言基础教程(我的C之旅开始了)[五]”的完整攻略。

标题

C 语言基础教程(我的 C 之旅开始了)[五]

概述

本次教程主要涵盖C语言中的结构体和联合体。在学习本篇教程前,需要先掌握C语言中的变量、循环、条件语句、指针等基础知识。

结构体

结构体是 C 语言中自定义的一种数据类型,通过结构体可以将多个不同类型的变量组合成一个整体,方便统一管理和使用。结构体定义的方式如下:

struct [结构体名]
{
    [成员变量1类型] [成员变量1名];
    [成员变量2类型] [成员变量2名];
    ...
    [成员变量n类型] [成员变量n名];
};

其中,[成员变量]可以是其他任意合法的数据类型,例如 int、char、float等。下面是一个结构体的示例:

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

结构体的使用

定义结构体之后,可以通过以下方式声明结构体变量:

struct student stu1;
struct student stu2 = {1, "张三", 18, 89.5};
struct student stu3 = {.name = "李四", .score = 77.5};

通过点运算符可以访问结构体的成员变量,例如:

stu1.id = 1;
strcpy(stu1.name, "张三");
stu1.age = 18;
stu1.score = 89.5;

结构体还可以作为函数的形参和返回值,例如:

struct student getStudent(int id, char name[], int age, float score)
{
    struct student stu;
    stu.id = id;
    strcpy(stu.name, name);
    stu.age = age;
    stu.score = score;
    return stu;
}

联合体

联合体是一种特殊的结构体,它所有成员都是从同一块内存中分配的,因此联合体只能存储其中任意一个成员。联合体定义的方式如下:

union [联合体名]
{
    [成员变量1类型] [成员变量1名];
    [成员变量2类型] [成员变量2名];
    ...
    [成员变量n类型] [成员变量n名];
}

下面是一个联合体的示例:

union number
{
    int i;
    float f;
};

可以通过以下方式声明联合体变量并访问:

union number n;
n.i = 10;
printf("%d\n", n.i);
n.f = 3.14;
printf("%f\n", n.f);
printf("%d\n", n.i);

这段代码中,先将 n.i 赋值为 10,然后将 n.f 赋值为 3.14。由于 n 的内存空间只有 4 个字节,所以在将 n.f 的值赋给 n.i 时,n.i 的值会发生改变。

示例说明

示例 1

假设需要设计一个学生成绩管理系统,每个学生有学号、姓名、年龄和成绩四个属性。定义一个结构体,然后通过动态内存分配的方式创建一个包含 3 个学生信息的数组,然后输出这个数组中每个学生的信息和总成绩。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

int main()
{
    struct student *stuArr;
    int i, n = 3;
    float sum = 0;
    stuArr = (struct student *)malloc(sizeof(struct student) * n);
    for (i = 0; i < n; i++)
    {
        printf("请输入第 %d 个学生的学号、姓名、年龄和成绩:", i + 1);
        scanf("%d %s %d %f", &stuArr[i].id, stuArr[i].name, &stuArr[i].age, &stuArr[i].score);
        sum += stuArr[i].score;
    }
    for (i = 0; i < n; i++)
    {
        printf("第 %d 个学生的信息:\n", i + 1);
        printf("学号:%d\n", stuArr[i].id);
        printf("姓名:%s\n", stuArr[i].name);
        printf("年龄:%d\n", stuArr[i].age);
        printf("成绩:%0.2f\n", stuArr[i].score);
    }
    printf("总成绩:%0.2f\n", sum);
    free(stuArr);
    return 0;
}

运行结果:

请输入第 1 个学生的学号、姓名、年龄和成绩:1001 张三 18 89.5
请输入第 2 个学生的学号、姓名、年龄和成绩:1002 李四 19 77.5
请输入第 3 个学生的学号、姓名、年龄和成绩:1003 王五 20 94.0
第 1 个学生的信息:
学号:1001
姓名:张三
年龄:18
成绩:89.50
第 2 个学生的信息:
学号:1002
姓名:李四
年龄:19
成绩:77.50
第 3 个学生的信息:
学号:1003
姓名:王五
年龄:20
成绩:94.00
总成绩:261.00

示例 2

假设需要设计一个数据类型转换程序,实现将整数、浮点数、字符等各种数据类型的值转换成字符串类型。由于不同类型的值要求显示的格式不同,因此可以使用联合体来存储各种类型的值。下面是这个程序的基本思路:

  1. 定义一个 union 类型 str,其中包含一个 char 数组 strArr 和一个整型变量 len,分别用来存储字符串和字符串的长度。
  2. 定义一个函数,它根据传入的数据类型将其值转换成字符串并存储到 str 变量中。具体转换方法如下:
  3. int 类型:使用 sprintf 函数将其转换为字符串。
  4. float 类型:使用 sprintf 函数将其转换为字符串,但需要指定格式为 "%.2f",表示保留 2 位小数。
  5. char 类型:直接将其赋值给 strArr 数组,同时将 len 变量赋值为 1。
  6. 其他类型:提示用户输入一个字符串,并将其赋值给 strArr 数组,并将 len 变量设为字符串的长度。
  7. 在主函数中分别测试各种类型的值的转换结果。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 100

union str
{
    char strArr[MAXLEN];
    int len;
};

void convertToInt(int num, union str *s)
{
    sprintf(s->strArr, "%d", num);
    s->len = strlen(s->strArr);
}

void convertToFloat(float num, union str *s)
{
    sprintf(s->strArr, "%.2f", num);
    s->len = strlen(s->strArr);
}

void convertToChar(char c, union str *s)
{
    s->strArr[0] = c;
    s->len = 1;
}

void convertToString(char *str, union str *s)
{
    strcpy(s->strArr, str);
    s->len = strlen(s->strArr);
}

int main()
{
    union str s;
    int num = 123;
    convertToInt(num, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    float fnum = 3.1415926;
    convertToFloat(fnum, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    char c = 'a';
    convertToChar(c, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    char str[MAXLEN];
    printf("请输入一个字符串:");
    scanf("%s", str);
    convertToString(str, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    return 0;
}

运行结果:

123
3

3.14
5

a
1

请输入一个字符串:hello
hello
5

总结

本篇教程介绍了 C 语言中的结构体和联合体,讲解了它们的定义、声明和使用方法,并通过两个示例展示了它们在实际程序中的应用。同时,还向大家推荐了动态内存分配的方法。希望大家能够掌握这些知识并在实践中进行多次练习,提升自己的编程能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 语言基础教程(我的C之旅开始了)[五] - Python技术站

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

相关文章

  • c++11 新特性——智能指针使用详解

    C++11 新特性——智能指针使用详解 在C++中,内存管理一直是一个非常重要的事情,一个常见的错误就是忘记释放先前分配的内存。C++11引入了智能指针,从而使得内存管理更加方便。本文将详细介绍智能指针的使用方法。 智能指针概述 C++中的智能指针是一种RAII(Resource Acquisition Is Initialization)机制的实现,它通过…

    C 2023年5月22日
    00
  • C语言scanf()和gets()的区别

    在C语言中,scanf()和gets()都是用于从标准输入流中读取用户输入的函数。它们有一些区别,下面我们来详细讲解它们的区别以及使用攻略。 scanf()和gets()的区别 输入方式不同:scanf()函数是按照指定格式从标准输入流中读取输入数据;而gets()函数则是以换行符为结束标志从标准输入流中读取整行字符串。 安全性不同:gets()函数会读取用…

    C 2023年5月10日
    00
  • C++ STL标准库std::vector扩容时进行深复制原因详解

    C++ STL标准库std::vector是一个提供动态数组功能的容器,它提供了扩容机制,即当当前存储的元素个数达到容量限制时,会自动将容量扩大一倍,以适应更多元素的存储。但在扩容的过程中,每一个元素都必须进行深复制操作,这是因为在动态内存分配中,变量在内存中的位置不连续,因此需要将每个元素重新复制到新的内存位置上。 下面以两个简单示例详细说明std::ve…

    C 2023年5月23日
    00
  • 网络工程师面试时喜欢问的问题与参考答案集锦

    网络工程师面试时,通常会涉及到网络基础知识、网络安全、网络管理和运维等方面的问题。以下是一些常见的问题及参考答案,供面试准备时参考。 一、网络基础知识 1. OSI七层模型和TCP/IP四层模型是什么? 答:OSI七层模型和TCP/IP四层模型都是计算机网络的层次模型。OSI七层模型包括:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。TCP/I…

    C 2023年5月22日
    00
  • java序列化与反序列化的使用方法汇总

    下面是对“java序列化与反序列化的使用方法汇总”的详细讲解。 什么是Java序列化和反序列化? Java序列化是指将Java对象转换为可存储或可传输格式的过程,也就是将Java对象转换成字节流的过程。Java反序列化则是将字节流转换成Java对象的过程。 Java序列化和反序列化功能被广泛地应用在网络传输和文件存储等场景中。 Java序列化的实现方式 Ja…

    C 2023年5月23日
    00
  • C++简易通讯录系统实现流程详解

    下面是C++简易通讯录系统实现流程的详细攻略: 1. 设计思路 本通讯录系统主要由以下几个部分组成: 联系人信息类ContactPerson: 包含联系人姓名、性别、电话号码、住址等属性。 实现获取、设置各属性值的方法。 通讯录类Contacts: 包含多个联系人对象,可以进行联系人的添加、删除、修改、遍历等操作。 通过文件操作实现通讯录的存储和读取。 主函…

    C 2023年5月30日
    00
  • 威联通301W路由器怎么样? 威联通301W拆机测评

    威联通301W路由器测评攻略 介绍 威联通301W是一款智能路由器,拥有多种配置选项和广泛的应用功能。本篇文章将从拆机、性能、易用性等多个方面对该路由器进行测评,为大家提供详细介绍。 拆机 首先,我们需要打开威联通301W路由器的外壳,了解内部构造。拆机步骤如下: 用螺丝刀将底部五颗螺丝去除 待底部外壳拆除后,用螺丝刀将顶部四颗螺丝去除 拆下顶部外壳,就可以…

    C 2023年5月23日
    00
  • JVM指令的使用深入详解

    JVM指令的使用深入详解 Java虚拟机是Java语言的运行环境,负责执行Java应用程序并提供运行时环境。Java虚拟机具有跨平台性、安全性、动态性、扩展性等优势,是Java程序能够跨平台运行的重要保障。Java虚拟机执行Java应用程序时使用的是Java字节码,Java字节码使用类似汇编语言的JVM指令进行描述。Java虚拟机的JVM指令提供了丰富的操作…

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