嵌入式学习——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;
}

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

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

相关文章

Ranni: Taming Text-to-Image Diffusion for Accurate Instruction Following

Ranni: Taming Text-to-Image Diffusion for Accurate Instruction Following abstract 我们引入了一个语义面板作为解码文本到图像的中间件&#xff0c;支持生成器更好地遵循指令 Related work 最近的工作还通过包含额外的条件&#xff08;如补全掩码[15&#xff0c;45]、…

天猫商品搜索API返回值说明:关键字搜索如何精准定位商品,精准定位,一键直达!

通过天猫商品搜索API&#xff0c;关键词搜索不再是难题。精准定位&#xff0c;快速找到您心仪的商品&#xff0c;开启便捷购物新时代。掌握API返回值的奥秘&#xff0c;让您的搜索更智能、更高效&#xff01; 天猫商品搜索API&#xff08;如item_search&#xff09;的返回值设计…

xyctf(write up)

ezhttp 因为是一道http的题&#xff0c;前端代码没有什么有效信息&#xff0c;但提示说密码在某个地方&#xff0c;我们用robots建立一个robots.txt文件来看有哪个文件可以访问 补充知识&#xff1a;http请求中via字段表示从哪个网址的服务器代理而来&#xff0c;user-agent表…

纯血鸿蒙APP实战开发——页面间共享组件实例的案例

介绍 本示例提供组件实例在页面间共享的解决方案&#xff1a;通过Stack容器&#xff0c;下层放地图组件&#xff0c;上层放Navigation组件来管理页面&#xff0c;页面可以共享下层的地图组件&#xff0c;页面中需要显示地图的区域设置为透明&#xff0c;并参考触摸交互控制&am…

git使用注意事项事项

以下操作均在gitee平台上实现 文章目录 1、本地仓库和远程仓库有冲突2、git提交自动忽略某些文件3、git无法push提交到远程仓库 1、本地仓库和远程仓库有冲突 在web端修改了文件内容或者删除了文件&#xff0c;本地仓库需要重新把远程仓库拉取到本地&#xff0c;或者强制提交到…

从零开始学RSA: [WUSTCTF2020]情书等5题

1 [WUSTCTF2020]情书 题目 Premise: Enumerate the alphabet by 0、1、2、..... 、25 Using the RSA system Encryption:0156 0821 1616 0041 0140 2130 1616 0793 Public Key:2537 and 13 Private Key:2537 and 937flag: wctf2020{Decryption}解题 前提&#xff1a;用0、…

GreptimeDB 助力国家电网数字换流站打造稳定高效的时序数据底座

电网体系作为现代社会运行的支柱之一&#xff0c;为各行各业、千家万户提供了电能的基本支持。从家庭到企业&#xff0c;医院到学校&#xff0c;交通到通讯&#xff0c;电力电网的应用贯穿始终。近年来&#xff0c;特高压换流站成为国家电网的重点建设工程&#xff0c;“十四五…

YUM源仓库部署和NFS共享存储服务

一.YUM源仓库部署 1.YUM 概述 &#xff08;1&#xff09;是基于RPM软件包构建的软件更新机制 &#xff08;2&#xff09;可以自动解决依赖关系 &#xff08;3&#xff09;所有软件包有集中的YUM软件仓库提供 2.准备YUM源 &#xff08;1&#xff09;软件仓库的提供方式&…

计算机组成结构—高速缓冲存储器(Cache)

目录 一、Cache的基本工作原理 1.Cache工作原理 2.命中率 3.Cache的基本结构 4.Cache的改进 二、Cache和主存之间的映射方式 1.直接映射 2.全相联映射 3.组相联映射 三、Cache中主存块的替换算法 四、Cache的写策略 概为了解决 CPU 和主存之间速度不匹配的问题&#x…

基于springboot+vue+Mysql的点餐平台网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

redis stream 作为消息队列的最详细的命令说明文档

简介 stream 作为消息队列&#xff0c;支持多次消费&#xff0c;重复消费&#xff0c;ack机制&#xff0c;消息异常处理机制。 涉及到以下几个概念&#xff0c;消息流&#xff0c;消费者组&#xff0c;消费者。 涉及到以下命令 # 添加消息到流中 XADD key [NOMKSTREAM] [&…

Al加码,引爆“躺平式”旅游 | 最新快讯

旅游业正迎来新的技术浪潮。 文&#xff5c;锌刻度&#xff0c;作者&#xff5c;孟会缘&#xff0c;编辑&#xff5c;李季 今年的五一&#xff0c;“微度假”“微旅行”纷纷出圈。 相较于三亚、云南等老牌旅游大热门&#xff0c;人们开始寻找一些不用“人挤人”的小众旅行目的…

谁能取代迈巴赫,征服互联网安全大佬周鸿祎?

‍作者 |老缅 编辑 |德新 4月18日&#xff0c;「周鸿祎卖车」登上了微博热搜。这位360创始人、董事长发微博称&#xff1a;自己做了一个艰难的决定&#xff0c;将把陪伴9年的迈巴赫600给卖掉。 随后&#xff0c;他解释道&#xff1a;「这是因为我需要体验新一代车的感觉。古人…

SQL注入——绕过information

衔接上文&#xff0c;进一步对SQL注入less-1进行禁止information的操作&#xff0c;上文连接如下&#xff1a; SQL注入less-1-CSDN博客 一、对less-1进行编辑 增加一段代码&#xff0c;作用是禁止information字段 二、进行检查 可以看到代码已经生效&#xff0c;禁止用infor…

TypeError报错处理

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Python中的TypeError简介 这个错误通常表示在方法调用时&#xff0c;参数类型不正确&#xff0c;或者在对字符串进行格式化操作时&#xff0c;提供的变量与预期不符。 二、错误的源头&#xff1a;字符串格式化…

调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。 参考 登录 - 支付宝 在沙箱环境下&#xff0c;已经分配好了用于模拟测试的应用信息、商家信息、买家信息等 小程序文档 - 支付宝文档中心 内网穿透&#xff08;支付宝付款需要在公网进行检查…

MybatisPlus也能轻松生成三层架构代码?

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、前言三层架构的流程图为什么使用…

为什么需要自动化测试?自动化有哪些优势?

前言 自动化测试&#xff0c;最近些年可谓是大火。招聘上的要求也好&#xff0c;培训班的广告也罢&#xff0c;比比皆是&#xff0c;足以说明它在业内的火爆程度。 虽然说会写自动化测试并不能说明你就很牛批&#xff0c;但是你不会的话&#xff0c;那么很抱歉&#xff0c;你…

保持 Hiti 证卡打印机清洁的重要性和推荐的清洁用品

在证卡印刷业务中&#xff0c;保持印刷设备的清洁至关重要。特别是对于 Hiti 证卡打印机来说&#xff0c;它们是生产高质量证卡的关键工具。保持设备清洁不仅可以保证打印质量和效率&#xff0c;还可以延长其使用寿命。本文将探讨保持 Hiti 证卡打印机清洁卡的重要性&#xff0…

数码管的显示

静态数码管显示 数码管有两种一种的负电压促发,一种是正电压促发,上图是单数码管的引脚 上图是数码管模组的引脚,采用了引脚复用技术 咱们这个单片机由8个单数码管,所以要用上38译码器,如下图 74138使能端,单片机上电直接就默认接通了 74HC245的作用是稳定输入输出,数据缓冲作…