C语言入门课程学习笔记10:结构体联合体位域

C语言入门课程学习笔记10

  • 第48课 - 自定义数据类型(上)
    • 实验-typedef
    • 实验
    • 小结
  • 第49课 - 自定义数据类型(中)
    • 实验
    • 实验
    • 小结
  • 第50课 - 自定义数据类型(下)
    • 实验
    • 实验
    • 小结
  • 第51课 - 多文件程序设计
    • 实验
    • 实验
    • 实验
    • 小结
  • 第52课 - 课程总结和展望

第48课 - 自定义数据类型(上)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-typedef

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

typedef  unsigned char  byte;//

void func()
{
    typedef  byte  uint8;

    uint8 var = 200;
    byte  b   = var;   // 本质为相同类型变量之间的初始化

    printf("sizeof(uint8) = %d\n", sizeof(uint8));
    printf("var = %d\n", var);
    printf("b = %d\n", b);
}

int main()
{
     //uint8 var = 1;   // ERROR
    byte b = 128;

    func();

    printf("sizeof(byte) = %d\n", sizeof(byte));
    printf("b = %d\n", b);

    return 0;
}
/*
sizeof(uint8) = 1
var = 200
b = 200
sizeof(byte) = 1
b = 128
*/
#include <stdio.h>
#include <string.h>

typedef  float(FArr5)[5];        // 定义数组类型名
typedef  int(IFuncII)(int, int); // 定义函数类型名

typedef  FArr5*    PFArr5;//新定义的类型PFArr5
typedef  IFuncII*  PIFuncII;

float g_arr[5] = {0.1, 0.2, 0.3};

int add(int a, int b)
{
    return a + b;
}

int main()
{
    FArr5* pa = &g_arr;  // float(*)[5]
    IFuncII* pf = add;   // int(*)(int,int)

    PFArr5   npa = pa;//指针
    PIFuncII npf = pf;

    int i = 0;

    for(i=0; i<5; i++)
    {
        printf("%f\n", (*pa)[i]);//元素值
        printf("%f\n", (*npa)[i]);
    }


    printf("%d\n", pf(2, 3));//5
    printf("%d\n", npf(2, 3));//5

    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

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

struct Student
{
    char name[20];
    int id;
    short major;
};

int main()
{
    struct Student s1 = {"Delphi", 908, 1};
    struct Student s2 = s1;

    printf("s1.name = %s\n", s1.name);
    printf("s1.id = %d\n", s1.id);
    printf("s1.major = %d\n", s1.major);

    strcpy(s2.name, "Tang");
    s2.id = 909;
    s2.major = 2;

    printf("s2.name = %s\n", s2.name);
    printf("s2.id = %d\n", s2.id);
    printf("s2.major = %d\n", s2.major);

    return 0;
}
/*
s1.name = Delphi
s1.id = 908
s1.major = 1
s2.name = Tang
s2.id = 909
s2.major = 2
*/


小结

在这里插入图片描述

第49课 - 自定义数据类型(中)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

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

typedef  struct Student  Stu;//定义新名称Stu

struct Student
{
    char name[20];
    int id;
    short major;
};

int main()
{
    Stu s;//
    Stu* ps = &s;

    strcpy(ps->name, "Delphi");

    ps->id = 1;
    ps->major = 908;

    (*ps).major = 910;   // ==> s.major = 910

    printf("s.name = %s\n", s.name);
    printf("s.id = %d\n", s.id);
    printf("s.major = %d\n", s.major);

    return 0;
}
/*
s.name = Delphi
s.id = 1
s.major = 910*/
#include <stdio.h>
#include <string.h>

struct Test;
struct Test* g_pt;    // 只要有了类型声明就可以创建对应的指针变量

// 必须先给出类型的完整定义才能创建相应类型的变量
struct Test
{
    int a;
    int b;
};

int main()
{
    struct Test t;

    t.a = 1;
    t.b = 2;

    g_pt = &t;

    printf("g_pt = %p\n", g_pt);
    printf("g_pt->a = %d\n", g_pt->a);//1
    printf("g_pt->b = %d\n", g_pt->b);//2

    return 0;
}
/*
g_pt = 000000000061FE18
g_pt->a = 1
g_pt->b = 2
*/

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

int main()
{
    struct { int a, b; } v1;
    struct { int a, b; } v2;
    struct { int a, b; }*pv;

    v1.a = 1;
    v1.b = 2;

   // v2 = v1;//??error: incompatible types when assigning to type 'struct <anonymous>' from type 'struct <anonymous>'看上去一样,其实是不同的类型

    pv = &v2;//warning: assignment to 'struct <anonymous> *' from incompatible pointer type 'struct <anonymous> *' 不可以

    return 0;
}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

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

struct BW
{
    unsigned char a : 4;
    unsigned char b : 2;
    unsigned char c : 2;
};

int main()
{
    struct BW bw = {0};//每个比特位都初始化为0

    bw.a = 10;
    bw.b = 4;   // 4 大于 b 能表示的最大值,因此赋值后 b 回转到 0
    bw.c = 3;

    printf("sizeof(struct BW) = %d\n", sizeof(struct BW));
    printf("bw.a = %d\n", bw.a);
    printf("bw.b = %d\n", bw.b);
    printf("bw.c = %d\n", bw.c);

    return 0;
}
/*
sizeof(struct BW) = 1
bw.a = 10
bw.b = 0
bw.c = 3
*/


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

struct Bits1
{
    int a   : 16;
    short b : 8;
    char c  : 8;
    float f;     // float f : 32;   ==> 浮点型成员不能指点位宽度
};

struct Bits2
{
    unsigned char a : 6;
    unsigned char b : 6;
    unsigned char c : 6;
    // unsigned char d : 9;    ==> 指定的位宽度不能大于声明类型的位宽度
};

struct Bits3
{
    unsigned char a : 4;
    unsigned char   : 0;  // 重启一个存储单元表示新的成员
    unsigned char b : 4;
};

int main()
{
    printf("sizeof(Bits1) = %d\n", sizeof(struct Bits1));//2+1+1+4=8不对  ???? 4+2+1每4个字节对齐
    printf("sizeof(Bits2) = %d\n", sizeof(struct Bits2));//3
    printf("sizeof(Bits3) = %d\n", sizeof(struct Bits3));//2

 printf("sizeof(float) = %d\n", sizeof(float));

    return 0;
}
/*
sizeof(Bits1) = 12
sizeof(Bits2) = 3
sizeof(Bits3) = 2*/


小结

在这里插入图片描述

第50课 - 自定义数据类型(下)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

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

union UTest//联合体
{
    int a;
    float f;
};

struct STest
{
    int a;
    float f;
};

int isLittleEndian()//低地址存在低字节数据
{
    union
    {
        int i;
        char a[4];
    } test = {0};

    test.i = 1;

    return (test.a[0] == 1);
}

int main()
{
    union UTest ut = {987654321};
    struct STest st = {987654321, 0.1f};

    printf("union UTest size = %d\n", sizeof(union UTest));
    printf("&ut.a = %p\n", &ut.a);
    printf("&ut.f = %p\n", &ut.f);//地址一样

    printf("struct STest size = %d\n", sizeof(struct STest));
    printf("&st.a = %p\n", &st.a);
    printf("&st.f = %p\n", &st.f);//地址不一样

    printf("ut.a = %d\n", ut.a);//
    printf("ut.f = %f\n", ut.f);//

    ut.f = 987654321.0f;

    printf("ut.a = %d\n", ut.a);
    printf("ut.f = %f\n", ut.f);

    printf("System Endian: %d\n", isLittleEndian());

    return 0;
}
/*
union UTest size = 4
&ut.a = 000000000061FE1C
&ut.f = 000000000061FE1C
struct STest size = 8
&st.a = 000000000061FE14
&st.f = 000000000061FE18
ut.a = 987654321
ut.f = 0.001697
ut.a = 1315666339
ut.f = 987654336.000000
System Endian: 1
*/


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

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

enum Day { MON = 1, TUE, WED, THU, FRI, SAT, SUN };
enum Season { Spring, Summer = 3, Autumn, Winter = -1 };

enum { CONSTANT = 12345 };

int main()
{
    enum Day d = TUE;
    enum Season s = Winter;

    int i = SUN;
    int j = Autumn;

    printf("d = %d\n", d);   // 2
    printf("s = %d\n", s);   // -1
    printf("i = %d\n", i);   // 7
    printf("j = %d\n", j);   // 4

    d = 0;
    s = -2;

    printf("d = %d\n", d);
    printf("s = %d\n", s);

    printf("sizeof(enum Day) = %d\n", sizeof(enum Day));
    printf("sizeof(enum Season) = %d\n", sizeof(enum Season));

    printf("CONSTANT = %d\n", CONSTANT);

    // CONSTANT = 54321;

    return 0;
}
/*
d = 2
s = -1
i = 7
j = 4
d = 0
s = -2
sizeof(enum Day) = 4
sizeof(enum Season) = 4
CONSTANT = 12345

*/



小结

在这里插入图片描述

第51课 - 多文件程序设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

在这里插入代码片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

在这里插入代码片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验

//opm.h
struct Test
{
    int a;
    int b;
};

extern int g_var;   // 声明全局变量时,不需要给出初始值
extern int f_var;

int add(int a, int b);
int mul(int, int);   // 进行函数声明的时候,可以省略参数名

extern void test();

//opm.c
#include <stdio.h>

int g_var = 1;
static int f_var = 2;   // 只能在当前文件中使用 ==> 静态全局变量

static void func()  // 静态函数只能在当前文件中被调用
{
    printf("void func() : f_var = %d\n", f_var);
}

void test()   // 当前文件中定义的所有函数都可以调用 func() 函数
{
    func();
}

int add(int a, int b)
{
    return a + b;
}

int mul(int a, int b)
{
    return a * b;
}
//main.c
#include <stdio.h>
#include <string.h>
#include "opm.h"

int main()
{
    struct Test t = {1, 2};

    printf("a + b = %d\n", add(t.a, t.b));
    printf("a * b = %d\n", mul(t.a, t.b));
    printf("g_var = %d\n", g_var);
    // printf("f_var = %d\n", f_var);   // 无法直接使用其他文件中定义的静态全局变量

    test();

    return 0;
}

小结

在这里插入图片描述

第52课 - 课程总结和展望

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739666.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python项目加密和增加时间许可证

1.bat&#xff0c;执行如下的命令&#xff0c;第一句是更新或增加许可证 第二句是加密draw_face.py python offer.py pyarmor obfuscate -O dist draw_face.py绘制自制人脸.py&#xff0c;调用加密的代码draw_face代码 import sys import os import cv2# 添加加密模块所在的路…

[MYSQL] 数据库基础

1.什么是数据库 从数据库的名字可以看出,它是用来操作(增删查改....)数据的,事实上也的确如此,通过数据库,我们可以更方便.更高效的来操作.管理数据 以文件形式存储数据的缺点 文件的安全问题文件不利于数据的查询和删除文件不利于存储海量数据操作文件并不方便 为了解决上述问…

煤矿运输新篇章:数字孪生模型引领智能化转型

在科技日新月异的今天&#xff0c;煤矿行业也迎来了前所未有的发展机遇。在这个充满挑战与机遇的时代&#xff0c;煤矿运输数字孪生模型以其独特的魅力和巨大的潜力&#xff0c;引领着煤矿运输领域走向智能化、高效化的新时代。 数字孪生模型&#xff0c;就是在虚拟世界中构建一…

喜讯:ISO年度审核通过!

在数字化时代&#xff0c;质量是我们不变的追求。近日&#xff0c;矩阵起源迎来了一个值得庆祝的时刻——三项ISO体系年度考核顺利通过&#xff01;分别为&#xff1a;ISO9001 质量管理体系标准认证、ISO20000信息技术服务管理体系认证及ISO27001 信息安全管理体系认证。 ISO标…

【分布式事务】分布式事务理论

CAP 理论 一致性&#xff08;Consistency&#xff09; 分布式系统中所有数据备份&#xff0c;在同一时刻是否是同样的值 可用性&#xff08;Availability&#xff09; 集群中一部分节点故障后&#xff0c;集群整体是否还能响应客户端的读写请求 分区容错性&#xff08;Partit…

移动硬盘损坏无法读取:故障解析与数据恢复策略

一、现象描述&#xff1a;移动硬盘损坏无法读取的困境 在数字化时代&#xff0c;移动硬盘作为数据存储的重要工具&#xff0c;广泛应用于个人和企业中。然而&#xff0c;当移动硬盘突然损坏&#xff0c;无法被系统正常读取时&#xff0c;往往会带来极大的困扰。用户可能会遇到…

《2024天猫618大促-首波男装销售报告》

这份报告主要分析了2024年天猫618大促期间的首波男装销售情况,从多个维度进行了深入的复盘和分析。报告中不仅包含了销售数据的统计分析,还对消费者行为、品牌表现、产品趋势等方面进行了详细的解读。通过对这些数据和信息的深入挖掘,报告揭示了当前男装市场的一些重要趋势和特…

冻干食品市场飙升至新高度,预计到 2030 年将达到 717 亿美元

冻干食品市场&#xff0c;近年来经历了显著增长&#xff0c;2021 年价值 372 亿美元&#xff0c;预计到 2030 年将达到 717 亿美元。 从2022年到2030年&#xff0c;这一强劲的扩张是由7.7%的复合年增长率推动的&#xff0c;这是由于多种因素造成的&#xff0c;包括食品加工行…

Linux命令重温

目录 Linux安装基础命令lsllcdpwdmkdirrmdirtouchcpmvrmvi/vim>和>>catheadlessmoretailechoclearwhich 进阶命令其他命令 Linux安装 通过vmware设置模拟硬件环境安装centos系统进行相应的网络配置安装xshell bin 存放二进制可执行文件(ls,cat,mkdir等) boot 存放用…

【STM32+FPGA】先进算力+强安全+边缘AI,64位STM32MP2聚焦工业4.0应用

工业应用数字化和智能化程度&#xff0c;是衡量新质生产力的重要标准。STM32最新一代64位微处理器STM32MP2凭借先进算力、丰富接口和高安全性&#xff0c;为高性能和高度互联的工业4.0应用赋能。 STM32MP2四大关键特性&#xff0c;为工业4.0应用赋能 STM32MP2系列的第一颗产品S…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

【Python时序预测系列】基于LSTM实现单变量时序序列多步预测(案例+源码)

这是我的第307篇原创文章。 一、引言 单站点单变量输入单变量输出多步预测问题----基于LSTM实现。 单输入就是输入1个特征变量 单输出就是预测出1个标签的结果 多步就是利用过去N天预测未来M天的结果 二、实现过程 2.1 读取数据集 # 读取数据集 data pd.read_csv(data.c…

超级内卷时代,这样做,刻不容缓

分享一个月入十万的赚钱项目 别再抱怨手上项目不好做&#xff0c;生意不好做了&#xff0c;这只是个开始&#xff0c;长远来看&#xff0c;2024应该是未来几年中经济环境最好的一年&#xff0c;我们所有人都已经进入到“超级内卷”时代&#xff01; 随着竞争环境越来越激烈&…

欢乐钓鱼大师游戏攻略:内置免费辅助工具的云手机!自动钓鱼!

《欢乐钓鱼大师》是一款极具趣味性和挑战性的钓鱼模拟游戏&#xff0c;玩家可以在虚拟的世界中体验到真实钓鱼的乐趣。本文将详细介绍游戏的各个方面&#xff0c;包括基本操作、鱼种识别、装备选择、技巧提升等&#xff0c;帮助玩家快速上手并逐步提升钓鱼技能。 《欢乐钓鱼大师…

010-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍几种相对基础的聚类算法&#xff0c;包括K-均值算法和均值漂移算法。 目录 10.1 聚类概述 10.1.1 聚类的种类 10.1.2 Sklearn聚类子模…

前年升2区,去年升TOP,目前扩刊中,投稿难度较小,这本SSCI可纳入考虑~

【SciencePub学术】今天给大家推荐的是一本经济管理领域的SSCI&#xff0c;大家都称之为TOP刊中的易中“水刊”。据说很多人已经靠信息差吃上了这本TOP刊的红利&#xff0c;接下来给大家解析一下这本期刊。 《Socio-Economic Planning Sciences》是一本国际性的学术期刊&#x…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 微生物数据具有一下的特点&#xff0c;这使得在做差异分析的时候需要考虑到更多的问题&…

文本批量高效编辑神器:空格秒变分隔符,提升工作效率

在信息爆炸的时代&#xff0c;文本处理已成为我们日常工作中不可或缺的一部分。然而&#xff0c;面对海量的文本数据&#xff0c;如何高效、准确地进行编辑和整理&#xff0c;成为了我们面临的难题。今天&#xff0c;我要向大家介绍一款文本批量高效编辑神器——首助编辑高手&a…

员工不会写OKR,有没有好的方法可以帮助他们?

在做 OKR 辅导的过程中&#xff0c;我发现很多公司在 OKR 制定的环节出现了问题&#xff0c;比如目标的方向不清晰、关键结果不如何 SMART 原则、描述冗长复杂、不够聚焦等。他们可能会认为刚刚开始推行&#xff0c;制定上出现一些问题无伤大雅&#xff0c;但这会对之后的 OKR …

材料科学SCI期刊,中科院2区,影响因子4.7

一、期刊名称 Progress in Natural Science-Materials International 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;材料科学 影响因子&#xff1a;4.7 中科院分区&#xff1a;2区 三、期刊征稿范围 由中国材料研究会负责的同行评议 由中国材料研究会&…