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;   // ERRORbyte 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));//5printf("%d\n", npf(2, 3));//5return 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;//定义新名称Stustruct 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 = 910printf("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);//1printf("g_pt->b = %d\n", g_pt->b);//2return 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};//每个比特位都初始化为0bw.a = 10;bw.b = 4;   // 4 大于 b 能表示的最大值,因此赋值后 b 回转到 0bw.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));//3printf("sizeof(Bits3) = %d\n", sizeof(struct Bits3));//2printf("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);   // 2printf("s = %d\n", s);   // -1printf("i = %d\n", i);   // 7printf("j = %d\n", j);   // 4d = 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课 - 课程总结和展望

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app picker多列选项

预期实现的效果&#xff1a; 选中后的效果&#xff1a; // Dom部分 <template><picker mode"multiSelector" :range"ssqRange" range-key"name" columnchange"ssqColumnChange" change"ssqChange" class"p…

研究发现GPT-4o等较新的多模态AI模型的安全机制有不足之处

在 ChatGPT 和类似的生成式人工智能模型推出后&#xff0c;很多人都在强调安全问题&#xff0c;政府也参与其中&#xff0c;OpenAI 甚至成立了一个超级协调小组&#xff0c;以阻止未来的人工智能失控&#xff0c;但由于对人工智能安全的发展方向存在分歧&#xff0c;该小组于今…

03逻辑门电路

分立门电路&#xff1a; 集成门电路&#xff1a; TTL门电路 MOS门电路&#xff1a;NMOS门电路、PMOS门电路、CMOS门电路 BICMOS门电路&#xff1a;CMOS的高输入阻抗和TTL的高放大倍数的结合 向更低功耗、更高速度发展 MOS管的Rdson在可变电阻区的阻值也一般会小于1000欧姆 …

达梦数据库的系统视图v$locked_object

达梦数据库的系统视图v$locked_object 在达梦数据库&#xff08;Dameng Database&#xff09;中&#xff0c;V$LOCKED_OBJECT 视图提供了与数据库中被锁定对象相关的信息。这通常用于监控和诊断数据库中的锁定问题&#xff0c;帮助管理员了解哪些对象被锁定了&#xff0c;以及…

1.回溯算法.基础

1.回溯算法 基础知识题目1.组合2.组合-优化3.组合总和|||4.电话号码和字母组合5.组合总和6.组合总和II7.分割回文串8.复原IP地址 基础知识 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯 因为回溯的本质是穷…

Excel 宏录制与VBA编程 —— 11、工作表及工作簿操作(附:Worksheets与Sheets区别)

代码1 - Worksheets与Sheets区别 Worksheets表示普通工作表;Sheets即可表示普通工作表也可表示图标工作表。 下面模块中代码结果是一样的,大家理解时可结合上面区别说明进行了解 Sub Test()Worksheets("Sheet1").Range("A1").Value 100Sheets("Sheet…

BioCLIP:物种图像的基础视觉模型

从无人机到个人手机&#xff0c;各种相机收集的自然世界图像是越来越丰富的生物信息来源。从图像中提取生物相关信息用于科学的计算方法和工具激增&#xff0c;尤其是计算机视觉。然而&#xff0c;其中大多数都是为特定任务设计的&#xff0c;不容易适应或扩展到新的问题、环境…

【AI大模型】Transformers大模型库(十二):Evaluate模型评估

目录 一、引言 二、Evaluate模型评估 2.1 概述 2.2 使用方法 2.2.1 步骤1: 导入必要的库 2.2.2 步骤2: 加载模型和分词器 2.2.3 步骤3: 准备数据集 2.2.4 步骤4: 数据预处理 2.2.5 步骤5: 创建训练和评估数据集 2.2.6 步骤6: 设置训练参数并创建Trainer 2.2.7 步…

基于Flask开发的前后端交互项目(可用于期末大作业) MySQL数据库 文件上传 Spider爬虫 Echarts可视化展示 JS动态

项目描述&#xff1a; 开发一个基于Flask框架开发的前后端交互项目&#xff0c;项目内容为 东京奥运会 。对各个需要填写的字段做了数据验证&#xff0c;非法信息会被JS拦截提醒不合法&#xff1b;还对未登录就访问做了拦截&#xff0c;阻止未登录就访问。 前端&#xff1a;HT…

idea 开发工具properties文件中的中文不显示

用idea打开一个项目&#xff0c;配置文件propertise中的中文都不展示&#xff0c;如图&#xff1a; 可修改idea配置让中文显示&#xff1a; 勾选箭头指向的框即可&#xff0c;点击应用保存&#xff0c;重新打开配置文件&#xff0c;显示正常

Java开发环境配置

一、JDK 下载JDK&#xff1a;Java Downloads | Oracle 配置环境变量&#xff1a;09、Java入门&#xff1a;Path、JAVA_HOME环境变量配置_哔哩哔哩_bilibili 二、IDEA 下载IDEA&#xff1a; Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) 建…

HotSpot 垃圾收集器

文章目录 前言HotSpot 垃圾收集器1. 查看jdk默认垃圾收集器命令2. 查看当前服务使用的是哪个垃圾收集器:3. 常用的垃圾收集器3.1. 并行垃圾收集器&#xff08;Parallel Garbage Collector&#xff09;3.2. CMS 垃圾收集器&#xff08;Concurrent Mark-Sweep Garbage Collector&…

情感分析方法与实践

第1关&#xff1a;情感分析的基本方法 情感分析简介 情感分析&#xff0c;又称意见挖掘、倾向性分析等。简单而言&#xff0c;是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。在日常生活中&#xff0c;情感分析的应用非常普遍&#xff0c;下面列举几种常见的…

Gradle学习-3 Gradle插件

1、Gredle插件是什么 Gradle插件是用于扩展和增强Gradle构建系统的功能模块通过插件&#xff0c;Gradle可以执行各种构建任务&#xff0c;如编译代码、打包应用、运行测试等 Gradle插件主要分为&#xff1a;二进制插件、脚本插件 二进制插件二进制插件是预编译的、可以复用的…

web学习笔记(七十二)

目录 1.vue2通过$parent实现组件传值——父传子 2.vue2 通过$children实现组件传值——子传父 3. provide和inject传值&#xff08;依赖注入&#xff09; 4.vue2如何操作dom 5.vue2如何拿到最新的dom 6.filters过滤器 7.vue2的生命周期 8.vuex的用法 1.vue2通过$parent…

大数据开发需要哪些职场知识

职场是个人情世故的江湖&#xff0c;除了专业技能&#xff0c;成功的大数据开发人员还需要掌握多种职场知识。以下是一些重要的职场知识和技能&#xff0c;结合实际例子详细说明。 目录 理论知识与工程实践理论知识工程实践例子 项目经验总结项目管理总结和反思例子 做事方式方…

一招教你搞定Windows系统指定IP不变[固定IP地址方法]

1.打开控制面板&#xff0c;找到“网络和Internet” 点击进入&#xff1a; 2.点击打开“网络和共享中心”后&#xff0c;选择“更改适配器选项”。 3.点击 “查看此连接的状态”&#xff0c; 接着点击“详细信息” 查看信息。记录当前的IP地址是 10.88.x.xx&#xff0c;后面我们…

Linux驱动开发笔记(九)IIC子系统及其驱动

文章目录 前言一、IIC驱动框架二、总线驱动2.1 iic总线的运行机制2.2 重要数据结构2.2.1 i2c_driver结构体2.2.2 i2c总线结构体 2.3 匹配规则 三、设备树的修改四、设备驱动的编写4.1 相关API函数4.1.1 i2c_add_adapter( )4.1.2 i2c_register_driver( )4.1.3 i2c_transfer( )4.…

Spring+SpringMVC+MyBatis整合

目录 1.SSM介绍1.1 什么是SSM&#xff1f;1.2 SSM框架1.2.1 Spring1.2.2 SpringMVC1.2.3 MyBatis 2.SSM框架整合2.1 建库建表2.2 创建工程2.3 pom.xml2.4 log4j.properties2.5 db.properties2.6 applicationContext-dao.xml2.7.applicationContext-tx.xml2.8 applicationContex…

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”&#xff0c;意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相…