添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
年轻有为的双杠  ·  npm ERR! gyp ERR! ...·  2 月前    · 
直爽的小摩托  ·  Spring cloud ...·  3 月前    · 
谦逊的沙滩裤  ·  【20180911】- ...·  1 年前    · 

1. 结构体

1.1结构体代码示例

张老太养了两只猫猫:一只名字叫小白,今年 3 岁,白色。还有一只叫小花,今年 100 岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。

d103d3dc96c142dfa3b19afea0e6b7d5.png

1.2.结构体和结构体变量的区别和联系

  1. 结构体是自定义的数据类型,表示的是一种数据类型
  2. 结构体变量代表一个具体变量,好比

3.Cat 就像一个“模板”,定义出来的结构体变量都含有相同的成员。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的

1.3.结构体变量在内存的布局

16b32dc196c04ec7957f565a48fcc99a.png

定义一个Cat类型的变量cat1,数据结构类型Cat中定义了char* name,int age,char* color;在变量cat1中,char* name指向了字符串"小白",int age = 2,char* color指向了字符串"白色"

1.4.如何声明结构体

1.5.成员

1.5.1.基本介绍

成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等

1.5.2.注意事项和细节说明

  1. 成员声明语法同变量,示例: 数据类型 成员名;
  2. 字段的类型可以为:基本类型、数组或指针、结构体等
  3. 在创建一个结构体变量后,需要给成员赋值,如果没有赋值就使用可能导致程序异常终止

b9ced81d65e140d4b191d3cbb936c066.png

4.不同结构体变量的成员是独立,互不影响,一个结构体变量的成员更改,不影响另外一个 (不同的结构体占用的是不同的内存空间)

ce0f5951e685461ba473b1c7a5d30739.png

1.6.创建结构体和结构体变量

(可以参考枚举类型)

  1. 先定义结构体,然后再创建结构体变量

2.在定义结构体的同时定义结构体变量

3.如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体数据类型,定义其他变量,在定义时也可 以不给出结构体名

1.7.成员的获取和赋值

结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]获取单个元素, 结构体使用点号.获取单个成员 (可以理解成访问某一结构体变量的某一成员) 获取结构体成员的一般格式为

1.赋值方式1:结构体变量名.成员名;

2.赋值方式2:在定义完结构体后,就按顺序直接进行赋值

2.共用体

2.1.共用体基本介绍

  1. 共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似,但是也有不同的地方。结构体和共用体的区别在于:结构体的各个成员会 占用不同的内存 互相之间没有影响 ;而共用体的所有成员 占用同一段内存 修改一个成员会影响其余所有成员
  2. 共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
};

2.2.共用体代码示例

  1. 共用体的定义同结构体的三种方式一样

2 0c6e50e4a4e24304abf64fb4f758ac93.png

3.过程分析

92add9e092194a5d90f2aebc35e88000.png

1.在进行到a.n = 0x40;时,由于0x40所表示的十六进制数对应的十进制数是64,并且,由于是对int类型进行赋值,因此,对a的四个字节进行赋值,将a的值设置为64,对应的内存中的二进制数为0100 0000;int需要4个字节, 因此,将a的四个字节,即0000 0000 0000 0000 0000 0000 0100 0000转换为十进制数,并且输出这个十进制数,即输出64;char需1个字节,因此,将a的第一个字节,即0100 0000,转换为十进制数, 并且输出这个十进制数所对应的ASCII码,即'@';short需要两个字节,因此,将a的第一个和第二个字节,即0000 0000 0100 0000转换为十进制数,并且输出这个十进制数,即输出64

c88b5ea77fdf434ea8a9f6dd8534d405.png

2. 在执行到a.ch = '9';时,由于ASCII码'9'所对应的十进制数为57,内存中转换为对应的二进制数为0011 1011,并且,由于是对char类型进行赋值,因此,对a的第一个字节进行赋值,;int需要4个字节,因此, ,将a的四个字节,即0000 0000 0000 0000 0000 0000 0011 1001,转换为十进制数,并且输出这个十进制数,即输出57;char需1个字节,因此,将a的第一个字节,即0011 1001,转换为十进制数, 并且输出这个十进制数所对应的ASCII码,即'9';short需要两个字节,因此,将a的第一个和第二个字节,即0000 0000 0011 1001,转换为十进制数,并且输出这个十进制数,即输出57

3. c6c99e12c2b846e08ba0cf173f5a2491.png

在执行到a.m = 0x2059;时,由于十六进制数0x2059对应的十进制数为8281,内存中转换为对应的二进制数为0010 0000 0101 1001,并且,由于是对short类型进行赋值,因此,对a的第一个和第二个字节进行赋值; int需要4个字节,因此,将a的四个字节,0000 0000 0000 0000 0010 0000 0101 1001,转换为十进制数,并且输出这个十进制数,即输出8281;char需1个字节,因此,将a的第一个字节,即0101 1001,转换为十进制数,并且输出这个十进制数所对应的ASCII码,即'Y';short需要两个字节,因此,将a的第一个和第二个字节,即0010 0000 0101 1001, 转换为十进制数,并且输出这个十进制数,即输出8281

0f8d155c15004040be91a2eacdbd0558.png

2.3.共用体练习

现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格,并请使用共用体编程完成

aa47552daaf6bd8f8850242067c9750.png

#include<stdio.h>
void main() {
    struct Information {//定义一个名字为Information的结构体
        char name[20];//字符数组name用于存放姓名
        int num;//整型num用于存放编号
        char sex;//字符sex用于存放性别
        char profession;//字符profession用于存放职业
        union SC{//在Information结构体中定义一个SC共用体,用于存放个体间不同的数据
            double score;//double类型score用于存放学生的成绩
            char course[20];//字符数组course用于存放老师的课程
    int i;
    struct Information studentAndTeacher[5];
    for (i = 0; i < 4; i++) {//遍历studentAndTeacher结构体数组,并存入数据
        printf("请输入名字:\n");
        scanf_s("%s", studentAndTeacher[i].name, sizeof(studentAndTeacher[i].name));
        printf("请输入编号:\n");
        scanf_s("%d", &studentAndTeacher[i].num);
        getchar();//用于接收键盘的回车
        printf("请输入性别(m/f):\n");
        scanf_s("%c", &studentAndTeacher[i].sex, sizeof(studentAndTeacher[i].sex));
        getchar();//用于接收键盘的回车
        printf("请输入职业(t/s):\n");
        scanf_s("%c", &studentAndTeacher[i].profession, sizeof(studentAndTeacher[i].profession));
        //判断之前输入的profession是t还是s
        if (studentAndTeacher[i].profession == 't') {//如果是t,则接下来输入course
            printf("请输入课程:\n");
            scanf_s("%s", studentAndTeacher[i].course, sizeof(studentAndTeacher[i].course));
        else if (studentAndTeacher[i].profession == 's') {//如果是s,则接下来输入score
            printf("请输入成绩:\n");
            scanf_s("%lf", &studentAndTeacher[i].score);
        else {
            printf("你输入的信息有误");
    printf("姓名\t编号\t性别\t职业\t课程/成绩\n");//输出表格的标题
    for (i = 0; i < 4; i++) {//遍历studentAndTeacher结构体数组,并输出数据
        printf("%s\t", studentAndTeacher[i].name);
        printf("%d\t", studentAndTeacher[i].num);
        printf("%c\t", studentAndTeacher[i].sex);
        printf("%c\t", studentAndTeacher[i].profession);
        if (studentAndTeacher[i].profession == 't') {
            printf_s("%s\n", studentAndTeacher[i].course);
        else {
            printf_s("%.2f\n", studentAndTeacher[i].score);
                【C语言初阶】 结构体入门
            
C语言提供了一些由系统已定义好的数据类型,如:int,float,char等,用户可以在程序中用它们定义变量,解决一般的问题,但我们要处理的问题往往比较复杂,只有系统提供的类型还不能满足应用的需求,C语言允许用户根据自己建立一些数据类型,并用它来定义变量。
【C语言初阶】带你轻松玩转所有常用操作符最终篇——下标引用、函数调用和结构体成员,表达式求值
【C语言初阶】带你轻松玩转所有常用操作符最终篇——下标引用、函数调用和结构体成员,表达式求值
C语言进阶---自定义类型详解(结构体+枚举+联合)
本章主要介绍了C语言自定义类型详解,比如:结构体,枚举,联合。详细介绍了结构体的大小计算方法。枚举的使用,联合(共用体)的定义的计算大小。以及后面实现通讯录小项目。
使用go-zero微服务框架实现云监控后台(三.c语言操作cJson封装,json和结构体互转)
使用go-zero微服务框架实现云监控后台(三.c语言操作cJson封装,json和结构体互转)