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

news2024/12/28 5:41:41

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课 - 课程总结和展望

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

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

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

相关文章

.net core接入nacos注册服务并使用配置中心

1、安装依赖 Nuget包&#xff1a;nacos-sdk-csharp.Extensions.Configuration和nacos-sdk-csharp.AspNetCore 2、在appsettings.json中配置 "nacos": {"ServerAddresses": ["http://localhost:8848/"],"DefaultTimeOut": 15000,"…

算法课程笔记——点积叉积

算法课程笔记——点积叉积

css实现鼠标悬停在div上出现抬起元素的效果

如图所示&#xff0c;左侧为正常样式&#xff0c;右侧为添加效果后的样式 只需要给div添加以下class样式&#xff0c;主要实现效果在&:hover里面 .component-item {display: flex;align-items: center;width: 50px;height: 50px;border: 1px solid #f0f0f0;border-radius…

昇思25天学习打卡营第1天|认识MindSpore

MindSpore 基本介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 易开发&#xff1a;API友好、调试难度低高效执行&#xff1a;包括计算效率、数据预处理效率和分布式训练效率全场景&#xff1a;框架同时支持云、…

海外注册 | 一分钟看懂英国医疗器械注册

英国医疗器械市场因其独特的地域划分而与其他国家有所不同。分为大不列颠市场&#xff08;包括&#xff1a;英格兰、苏格兰和威尔士&#xff09;和北爱尔兰市场&#xff0c;它们在法规要求上存在细微差别。 以下是针对这两个市场的基本要求概览&#xff1a; 监管机构&#xf…

超越招聘技术人才目标的最佳技术招聘统计数据

研究发现&#xff0c;难以找到的人才比以往任何时候都更难找到&#xff1a;根据新人才委员会招聘调查报告&#xff1a;2024年难以找到的人才的战略和战略&#xff0c;60%的受访者表示&#xff0c;熟练人才的招聘时间比一年前长。调查进一步揭示了以下关于招聘技术的关键事实&am…

行业原型:智能资产管理平台-个人资产服务

​行业原型预览链接&#xff1a;&#xff08;请与班主任联系获取原型文档&#xff09; 文件类型&#xff1a;.rp 支持版本&#xff1a;Axrure RP 8 文档名称&#xff1a;金融&#xff1a;智能资产管理平台&#xff08;个人资产服务&#xff09; 文件大小&#xff1a;1.75 MB 智…

Origin较好用的科研绘图软件

推荐自己也在用的科研绘图软件Origin图所示&#xff1a; 图1 图2 图3

【Sa-Token|4】Sa-Token微服务项目应用

若微服务数量多&#xff0c;如果每个服务都改动&#xff0c;工作量大&#xff0c;则可以只在网关和用户中心进行改动&#xff0c;也是可以实现服务之间的跳转。 这种方式可以通过在网关服务中生成和验证 Sa-Token&#xff0c;并将其与现有的 Token关联存储在 Redis 中。用户中心…

Springboot整合Mongodb(含使用案例)

基础语法 插入 插入单条 // 插入一条数据到 "Books" 集合 db.Books.insertOne({title: "如何使用MongoDB",author: "IT小辉同学",year: 2023 })插入多条数据 // 插入十条数据到 "Books" 集合 db.Books.insertMany([{ title: "…

面试必备:10种分布式ID的生成方案

前言 日常工作中&#xff0c;我们开发的系统、或者中间件&#xff0c;都是分布式部署的。比如你的订单数据库&#xff0c;做了分库分表&#xff0c;这时候&#xff0c;你需要一个唯一的ID来标记一条数据。这时候&#xff0c;就需要分布式ID。分布式ID是在分布式系统下使用的ID…

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

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

2023 联邦推荐系统综述

本博客结合2023年发表的综述文章&#xff0c;对近期一些联邦推荐文章进行总结&#xff0c;综述原文&#xff1a; SUN Z, XU Y, LIU Y, et al. A Survey on Federated Recommendation Systems[J]. 2023.https://doi.org/10.48550/arXiv.2301.00767 引言 最近&#xff0c;已有许多…

基于SpringBoot小区物业智能卡管理设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

金融科技在智能投研领域的革新与未来趋势

金融科技作为当今金融行业的重要驱动力&#xff0c;其在智能投研领域的应用正逐渐改变传统的投资研究模式&#xff0c;引领着行业向更加智能、高效的方向发展。本文将从不同角度探讨金融科技在智能投研领域的革新及未来趋势。 一、技术革新&#xff1a;从数据分析到智能决策 金…

shell条件测试语句

条件测试&#xff1a; $&#xff1f; 返回码 判断命令或者脚本是否执行成功 为0 true 为真就是成功 非0 fales 失败或者异常 test命令 可以进行条件测试&#xff0c;然后根据返回值来判断条件是否成立 -e &#xff1a;测试文件或者目录是否存在 -d &#xff1a;只能测试…

酸纯化器酸蒸馏器提取系统亚沸腾高纯酸蒸馏硝酸盐酸氢氟酸

一、产品简介 酸纯化器&#xff1a;亦称高纯酸蒸馏纯化器、酸蒸馏器、亚沸腾蒸馏装置&#xff0c;简称酸纯化器(南京-瑞尼克-科技)是超净化实验产品&#xff0c;后期提取的高纯酸、高纯水可以配套我们公司Teflon系列的器皿使用。 二、工作原理 酸纯化器是利用热辐射原理&…

Mac清理系统数据小技巧,告别卡顿烦恼 苹果电脑清理内存怎么清理

任何使用Mac的用户都会同意&#xff1a;没有什么比一台运行缓慢的电脑更能消磨人的耐心了。那些无休止的彩球旋转、程序响应迟缓、突然的系统冻结&#xff0c;这一切都让人想抓狂&#xff01;但别担心&#xff0c;这里有一些简单的Mac清理系统数据小技巧和CleanMyMac X的神助攻…

Codeforces Round 954 (Div.3)

传送门 A. X Axis 时间限制&#xff1a;2秒 空间限制&#xff1a;256MB 输入&#xff1a;标准输入 输出&#xff1a;标准输出 问题描述 你有三个位于 X 轴上的整数坐标点 , 和 &#xff08;其中 &#xff09;。你可以选择 X 轴上任意一个整数坐标点 …

Windows环境如何ssh远程连接本地局域网内的Archcraft系统

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用…