嵌入式学习——C语言基础——day14

1. 共用体

1.1 定义

    union 共用名 {
        数据类型1 成员变量1;
        数据类型2 成员变量2;
        数据类型3 成员变量3;
        ..
    };

1.2 共用体和结构体的区别

        1. 结构体每个成员变量空间独立

        2. 共用体每个成员变量空间共享

1.3 判断内存大小端

        1. 内存大端:内存低地址处存放高数据位,内存高地址处存放低数据位

        2. 内存小端:内存低地址处存放低数据位,内存高地址处存放高数据位

        3. 主函数中判断内存大小端

#include <stdio.h>int main(void)
{int num = 0x11223344;char *p = (char *)&num;if (0x11 == *p){printf("大端!\n");}else if (0x44 == *p){printf("小端!\n");}return 0;
}

        4. 利用共用体判断内存大小端

#include <stdio.h>union u 
{char a;int b;
};int main(void)
{union u u1;u1.b = 1;if (u1.a){printf("小端!\n");}else {printf("大端!\n");}return 0;
}

2. 枚举

2.1 定义

        enum 枚举类型名

{        

        枚举常量1,

        枚举常量2,

        ......

};

        例1

#include <stdio.h>enum stu
{one = 1,two,three,
};int main(void)
{printf("%d\n", one);return 0;
}

        例2

#include <stdio.h>enum Weekday 
{MONDAY = 1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
};int main() 
{enum Weekday today;today = WEDNESDAY;// 给变量赋值printf("today = %d\n", today);return 0;
}

2.2 注意

3. 位运算(重点)

&        按位与    

        1. 与0得0、与1不变)(全1为1,有0得0)

        2. 指定位置0

        3. 将字节中第n位置0

            P0 &= ~(1 << n);

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置0:

            P0 &= ~((1 << n) | (1 << m));

|        按位或

        1. (或1得1、或0不变)(全0为0,有1得1)

        2.  指定位置1

        3. 将字节中第n位置1

             P0 |= (1 << n);

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)置1:

             P0 |=  ((1 << n) | (1 << m));

^        按位异或

        1. (相同为0、相异为1)    (异或1翻转原位, 异或0原位不变)

        2. 指定位翻转

        3. num ^ num == 0        num ^ 0 == num

        4. 让一个字节第n位(从右往左第n位)和第m位(从右往左第m位)翻转:

            P0 ^= ((1 << n) | (1 << m));

        5. 交换两数(根据3中的规则替换变量可以推出)

#include <stdio.h>int main(void)
{int a = 10;int b = 20;a = a ^ b;b = a ^ b;a = a ^ b;printf("a = %d, b = %d\n", a, b);return 0;
}

~        按位取反

<<        左移

>>        右移                

                   (算数右移:有符号signed  正数左补0  负数左补1)
                 (逻辑右移:移动不考虑正负

4. 内存管理

4.1 内存分区管理

4.2 堆区空间的开辟和释放

(1)malloc

        1. 定义        

                void *malloc(size_t size);

        2. 功能

                申请堆区空间

        3. 参数

                size:申请堆区空间的大小

        4. 返回值

                成功:返回堆区空间的首地址

                失败:返回NULL

#include <stdio.h>
#include <stdlib.h>int main(void)
{int *p = NULL;p = malloc(4);if (NULL == p){printf("malloc failed!\n");return -1;}*p = 100;printf("*p = %d\n", *p);free(p);return 0;
}

(2)free

        1. 定义

                void free(void *ptr);

        2. 功能

                释放堆区空间

        3. 参数

                ptr:堆区空间首地址

        4. 返回值

                缺省

4.3 内存溢出、内存泄漏、内存碎片

        1. 内存溢出:也称内存越界,操作超过变量范围的空间数据

        2. 内存泄漏:malloc申请的空间没有使用free释放

        3. 内存碎片:由于频繁malloc和free小空间,导致大的连续空间由于中间存在小空间被占用而无法得到申请空间的现象称为内存碎片

4.4 数组和链表的区别

        1. 数组

                1. 空间连续(访问数据方便、空间必须连续)

                2. 数组元素必须是有限

                3. 数组插入、删除元素效率低

        2. 链表

                1. 空间不需要连续(访问数据麻烦、空间不需要连续,可以使用小的分散空间)

                2. 链表元素可以没有上限

                3. 链表插入、删除元素效率高

4.5 链表的分类

        1. 有无头分为:有头链表和无头链表

        2. 方向性:单向链表和双向链表

4.6 链表的定义

#include <stdio.h>
#include <stdlib.h>typedef int datatype;						//定义链表存放数据的类型 typedef struct node							//链表节点类型
{datatype data;							//存放数据struct node *pnext;						//下一个节点的地址
}linknode;linknode *createlinklist(void)
{linknode *ptmpnode = NULL;ptmpnode = malloc(sizeof(linknode));if (NULL == ptmpnode){printf("malloc failed!\n");return NULL;}ptmpnode->pnext = NULL;return ptmpnode;
}int main(void)
{linknode *plinklist = NULL;plinklist = createlinklist();return 0;
}

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

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

相关文章

大数据在互联网领域的“九大”应用

当下越来越多的应用涉及到大数据&#xff0c;而这些大数据的属性&#xff0c;包括数量&#xff0c;速度&#xff0c;多样性等等都呈现出大数据不断增长的复杂性&#xff0c;所以大数据的分析方法在大数据领域就显得尤为重要&#xff0c;目前互联网大数据运用的九大领域&#xf…

4个可将 iPhone iPad iPod 修复至正常状态的 iOS 系统恢复软件

许多iOS用户对操作系统问题感到恐慌&#xff0c;例如iPhone卡在恢复模式、白屏死机、黑屏死机、iOS系统损坏、iTunes连接屏幕、iPhone数据丢失等。这些状态通常很无聊&#xff0c;因为您无法使用 iPhone 执行任何操作。 4个可将 iPhone iPad iPod 修复至正常状态的 iOS 系统恢复…

7-zip下载、安装

7-Zip 官方中文网站 (sparanoid.com) 7-Zip - 程序下载 (sparanoid.com)

直播预告|第一批 Vision Pro 开发者开始弃坑了吗? 本周六一起听听三位 XR 开发者的真实想法!

随着技术的进步&#xff0c;扩展现实&#xff08;XR&#xff09;行业正在迅速发展&#xff0c;成为连接现实与虚拟世界的桥梁。XR 技术&#xff0c;包括虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和混合现实&#xff08;MR&#xff09;&#xff…

4. RedHat认证-进程管理

4. RedHat认证-进程管理 1.进程概念 进程就是正在运行中的程序或者命令 每一个进程都是运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占有一定的资源空间 程序消耗的是磁盘资源、进程消耗的是内存和CPU资源 进程会占用四类资源&#xff08;CPU 、内存、磁盘、网…

GEE错误——image.reduceRegion is not a function

简介 image.reduceRegion is not a function 这里的主要问题是我们进行地统计分析的时候&#xff0c;我们的作用对象必须是单景影像&#xff0c;而不是影像集合 错误"image.reduceRegion is not a function" 表示你正在尝试使用reduceRegion()函数来处理图像数据&…

电销卡与电话管家是什么

防封电销卡是啥&#xff1f; 也许有的人并不是很清晰&#xff0c;实际上防封电销卡也是电销业务流程运用避免封号的一种手机卡&#xff0c;它的作用实际上跟一般的用号码卡语音通话是类似的&#xff0c;唯独不一样的是防封电销卡是加入白名单的&#xff0c;让电销业务在开展的过…

使用C#和EF Core实现高效的SQL批量插入

在软件开发中&#xff0c;批量插入数据是一个常见的需求&#xff0c;特别是在数据迁移、初始化数据库或进行大量数据处理时。Entity Framework Core (EF Core) 是一个流行的.NET对象关系映射器&#xff08;ORM&#xff09;&#xff0c;它简化了数据库操作&#xff0c;但在进行大…

C语言知识点补充——ASCLL码表

1、ASCLL码表 ASCII码表&#xff08;American Standard Code for Information Interchange&#xff09;是一种用于将字符编码为数字的标准。它定义了128个字符的编码方式&#xff0c;包括数字、字母、标点符号和控制字符等。每个字符都对应一个唯一的7位或8位二进制数 2、Ascl…

(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型

文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段&#xff1a;输出阶段&#xff1a;步骤说明&#xff1a; 第一阶段&#xff1a;通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…

【C++】继承 — 继承的引入、赋值切片详细讲解

前言 我们知道C语言是一门面向对象编程的语言&#xff0c;而面向对象编程有三大特性&#xff0c;它们分别是&#xff1a; 封装继承多态 目录 1. 继承的概念及定义1.1继承的概念1.2继承的定义格式1.3 继承的使用 2 基类和派生类对象赋值转换3 继承中的作用域3.1 派生类对象的存…

升级OpenSSH版本(安装telnet远程管理主机)

一 OpenSSH是什么 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09; 协议的免费开源实现。SSH协议族可以用来进行远程控制&#xff0c; 或在计算机之间传送文件。而实现此功能的传统方式&#xff0c;如telnet(终端仿真协议)、 rcp ftp、 rlogin、 rsh都是极为不安全的&…