嵌入式学习——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 注意

        1. 枚举变量的值在枚举常量中选择其一作为它的值

        2. 枚举常量默认为int类型,第一个枚举常量的值默认为0,后续枚举常量的值为前一个枚举常量的值+1

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中的规则替换变量可以推出)(c语言中不使用第三方变量)

#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;//不加typedef时为定义变量,加typedef时为struct node起了一个类型别名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://xiahunao.cn/news/3014851.html

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

相关文章

doris 启动be报错

doris版本是1.2.4 java版本是&#xff1a;1.8 刚开始我以为是版本不兼容问题&#xff0c;后面发现思路错了&#xff0c;版本是兼容的&#xff0c;报以下错我的原因是操作系统没有达到安装要求 以下是博主在部署doris x64(avx2)版本中遇到的小bug 在大家使用doris的时候应该…

翻译《The Old New Thing》- Does Windows have a limit of 2000 threads per process?

Does Windows have a limit of 2000 threads per process? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050729-14/?p34773 Raymond Chen 2005年07月29日 Windows 是否有一个每个进程2000线程的限制&#xff1f; 简要 文章解释了在 W…

javascript中的DOM和BOM

目录 JavaScript中的对象 简介&#xff1a; js对象的基本用法&#xff1a; 创建对象&#xff1a; 访问对象的属性&#xff1a; 设置修改对象的属性&#xff1a; 删除对象的属性&#xff1a; DOM&#xff08;文档对象模型&#xff09; 简介&#xff1a; DOM对象的属性…

探索未来居住新纪元:公寓商场综合楼可视化引领潮流

在繁忙的都市生活中&#xff0c;我们都渴望找到一处既能满足居住需求&#xff0c;又能提供便捷购物体验的理想之地。如今&#xff0c;这一梦想已不再是遥不可及&#xff0c;随着科技的飞速发展&#xff0c;3D可视化技术正逐渐走进我们的生活&#xff0c;为我们带来前所未有的居…

用脚本写一个日期样式的字符

现在想要诸如此类样式的语句&#xff1a;&#xff08;过去三个月的&#xff09; 可以用python脚本写&#xff1a; from datetime import date, timedelta# 获取当前日期 current_date date.today()# 定义过去三个月的时间间隔 three_months_ago current_date - timedelta(da…

第二证券|集合竞价915到920能成交吗?

不能&#xff0c;买卖日9点15分到9点20分是集合竞价申报时刻&#xff0c;还没有发生集合竞价。 在这个时刻段内&#xff0c;投资者能够申报&#xff0c;也能够撤单&#xff0c;但这些挂单并不会立即成交。9:25时&#xff0c;系统会对一切收到的挂单进行一次性促成处理&#xf…

python 12实验

1.导入数据。 2.清洗数据&#xff0c;将缺失值或“NAN”替换为“无”&#xff0c;并将文本数据转换为数值型数据。 3.使用聚类算法&#xff08;如KMeans&#xff09;对数据进行聚类&#xff0c;并计算样本到簇中心的平均距离以确定最佳的簇数量。 4.对数据进行PCA降维&#xff…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代&#xff0c;个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI&#xff0c;为消费者提供了精彩的内容推荐服务&#xff0c;更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好&#xff0c;能够快速识别其兴趣…

「51媒体」企业单位新闻稿件考核,怎么发布

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电力税务企事业单位部门等单位提供了新闻稿件&#xff0c;如何在一些重点媒体进行宣发呢&#xff1a; 精准锁定发布媒体 了解考核要求&#xff1a;仔细阅读宣传任务名单&#xff0c;了解…

Leetcode167两数之和

题目链接&#xff1a; 167两数之和 解题思路: 缩减空间法 // 167 两数之和 缩减搜索空间方法 vector<int> twoSum(vector<int>& numbers, int target) {int i 0;int j numbers.size() - 1;while (i < j){int tmp numbers[i] numbers[j];if (tmp tar…

迈向语音大模型的平权之路

什么样的事情最有价值&#xff1f;难且正确的事情。把 1B 级别的大模型优化到和 200M级别模型相同水平的 RTF 同时 WER 维持代差&#xff0c;难道不是一件该令人亢奋的事情吗&#xff1f; -- 向前看&#xff0c;别回头 在两个月前的年度总结中&#xff0c;WeNet 社区已经开始向…

有哪些岗位适合持有CISAW证书的人去申请?有哪些优势?

持有CISAW证书的人&#xff0c;原来有这么多高薪岗位可以选择&#xff01; CISAW证书是信息安全领域的权威认证&#xff0c;持有该证书的人具备较高的专业能力和水平&#xff0c;可以胜任多种信息安全相关岗位。 马老师&#xff1a;13521730416 信息安全工程师是其中一类&…

【Qt】深入理解QWidget常用控件: enable属性、geometry属性和window frame属性

文章目录 前言&#xff1a;1. 什么是控件2. Qt中QWidget控件的常用属性及元编程QWidget 核心属性enable属性&#xff1a;geometry 属性 :window frame 窗口框架 总结: 前言&#xff1a; 图形化界面的开发常常需要使用各种控件&#xff0c;而Qt作为一个强大的跨平台GUI应用程序…

【iOS逆向与安全】网上gw如何自动登录与签到SM2,SM3,SM4算法加解密

1.下载 app 2.frida 调试 3.抓包查看接口 4.分析加密数据 5.易语言编写代码 1 .开始下载 下载好发现有越狱检测&#xff0c;检测点为&#xff1a; -[AppDelegate isJailBreak]; 于是编写插件xm代码 : %hook AppDelegate- (void)isJailBreak{NSLog("AppDelegate is…

【cpp题解】动态规划之爬楼梯 (70)

目录 前言我的思路思路一思路二 我的代码 前言 今天我来学一学动态规划&#xff0c;大二的时候学算法分析与设计&#xff0c;觉得算法是真难&#xff0c;有些高不可攀。现在大四了&#xff0c;其实今天稍微学了一下&#xff0c;简单的动态规划问题就和递归差不多&#xff0c;没…

linux虚拟机配置环境

1.配置虚拟机 在VMware中安装CentOS7&#xff08;超详细的图文教程&#xff09;_在vmware上安装centos-CSDN博客https://blog.csdn.net/qq_45743985/article/details/121152504 2.固定虚拟机ip地址 Vmware虚拟机Linux配置固定IP地址&#xff08;详细版&#xff09;_虚拟机固…

教你快速记录每日待办事项,并提醒自己按时完成不忘记

在忙碌的日常生活中&#xff0c;我们经常会面临待办事项繁杂、时间紧迫的困扰。为了更高效地管理时间和任务&#xff0c;我们需要一个能够快速记录并准时提醒我们完成待办事项的工具。此时&#xff0c;敬业签这类的待办软件就成为了很多人的首选工具。 敬业签是一款功能强大的…

HTML5+CSS3+JS小实例:旋转渐变光标

实例:旋转渐变光标 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

目录 1.Redis 分布式锁 &#xff08;1&#xff09;Redis 最普通的分布式锁 &#xff08;2&#xff09;RedLock 算法 2.zk 分布式锁 3.redis 分布式锁和zk分布式锁的对比 1.Redis 分布式锁 官方叫做 RedLock 算法&#xff0c;是 Redis 官方支持的分布式锁算法。 这个分布式…

24年最新AI数字人简单混剪

24年最新AI数字人简单混剪 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x