嵌入式C语言的7个硬核知识

1

void 与 void*

void表示的是无类型,不可以采用这个类型声明变量或常量,但是可以把指针定义为void类型,如void* ptr。

void指针可以指向任意类型的数据,可用任意数据类型的指针对void指针赋值,比如int *ptrInt;void *ptrVoid = ptrInt ;指针的赋值可以认为是地址的传递,而一般的32位系统指针都是占用4个字节,所以指针赋值仅仅只是这4个字节的赋值与类型没什么关系。

1void * memcpy( void *dest, const void *src, size_t len );
2void * memset( void * buffer, int c, size_t num);

 

2

volatile关键字

volatile修饰表示变量是易变的,编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值,而不是使用保存在寄存器里的备份,有效的防止编译器自动优化,从而与软件设计相符合。

3

数据占用大小

数据占用大小是指不同的数据类型在平台中所占用的字节个数,不同的平台不同类型占用的字节个数稍有不同,不过在对应的平台进行开发过程中,必须要对每个数据类型的占用大小了如指掌,否则各种数据溢出,数据越界等等接踵而来。下面是简单罗列的一些数据占用情况:(在一般32位PC中)

char

8bit

short

16bit

int

32bit

long

32bit

float

32bit

double

64bit

4

const与指针

const是恒定不变的意思,与指针的结合主要的问题是其const在指针中的位置导致该变量属性不同。主要的识别办法是去掉数据类型,看const修饰的是哪部分。

const int *ptr --> const *ptr -->那么const修饰的就是*ptr,而*ptr表示的是指针所指向内容,所以其总体也叫"常量指针"表示值无法改变。

int *const ptr --> *const ptr -->那么const修饰的就是ptr,而ptr表示的是指针变量,指针变量的值就是地址,所以总体也叫"指针常量"表示地址无法改变。

5

结构体与共联体

对于结构体和共联体在嵌入式领域是使用得非常频繁的,一些可编程芯片提供的寄存器库都是采用结构体和共联体结合的方式来提供给软件人员进行开发,同时在平时的编码过程中这两个数据类型的灵活应用也能够实现代码更好的封装与简化。

    如下面的简单示例,就可以非常灵活的访问Val中的bit位。

 1typedef union2{3    BYTE Val;4    struct __packed5    {6        BYTE b0:1;7        BYTE b1:1;8        BYTE b2:1;9        BYTE b3:1;
10        BYTE b4:1;
11        BYTE b5:1;
12        BYTE b6:1;
13        BYTE b7:1;
14    } bits;
15}BYTE_VAL, BYTE_BITS;

6

预定义标识符

一般编译器都支持预定义标识符,这些标识符结合printf等打印信息帮助程序员调试程序是非常有用的,一般编译器会自动根据用户指定完成替换和处理。

如下是常用的标识:

__FILE__  :表示进行编译的源文件字符串;

__LINE__ :表示当前文件的行号;

__DATE__:表示文件日期;

__TIME__ :表示文件时间;

7

#与##

#:是一种运算符,用于带参宏的文本替换,将跟在后面的参数转成一个字符串常量。

##:是一种运算符,是将两个运算对象连接在一起,也只能出现在带参宏定义的文本替换中。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

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

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

相关文章

python离线安装第三方库whl_详细说明如何在pycharm不联网的情况下,离线安装第三方库及依赖包(如sklearn)...

1、安装目标库1、首先,选择你要导入的库文件,如seaborn库下载网站:https://pypi.org/或https://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy2、在下载路径下空白处,按住Shift鼠标右键,选择在此处打开命令窗口执行安装命…

java 手机网站 cookie操作_java操作cookie问题

做的一个ssh项目,其中需要使用cookie来辅助记录用户页面访问量。可是我在使用的时候出现问题,就是我设置了有效期,但是关闭浏览器后或者重新打开另一个浏览器均不能获取到设置的coo...做的一个ssh项目,其中需要使用cookie来辅助记…

C语言指针用得好犹如神助!这些使用技巧值得收藏

指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。比如JAVA,java是没有指针的,但是很多地方都用到指针,不过不对用户开放,…

wso2_使用WSO2开发

wso2几个月以来,我又开始使用WSO2产品。 在接下来的文章中,我描述了我遇到的一些(小)问题以及如何解决它们。 设置开发环境时,我要做的第一件事是在Mac上下载Developer Studi o(64位版本)。 解…

python数据获取手段包括哪些_python开发应用-本地数据获取方法

文件的打开、读写和关闭文件的打开:file_objopen(filename,moder,buffering-1,...)filename是强制参数mode是可选参数,默认值是rbuffering是可选参数,默认值为-1(0代表不缓冲,1或大于1的值表示缓冲一行或指定缓冲区大小)f1open(e:…

有意思的C语言运算符

在C语言中,运算符用于执行程序代码运算,会针对两个或者两个以上操作数进行运算。比如:5 - 2,它的操作数是 5 和 2,而运算符则是 “-”。常见的运算符可大致分为 4 种类型:算术运算符、关系运算符、赋值运算…

java反向映射_opencv 直方图和直方图反向映射

histogram使用np进行直方图像素统计通过histogram对图像的三个通道分别进行一维直方图统计,由于被统计的数组必须是一维的,所以使用ravel将二维数组转换为一维数组,通过range参数指定统计区间为0--256,bin参数指定将统计区间分为2…

hamcrest_重新设计Hamcrest

hamcrest我在Hamcrest库上做了几篇文章 ,我确实很喜欢使用它,但是我希望对其进行一些更改。 我了解他们所做的大多数设计决策,但我认为其中一些确实不值得。 介绍Litecrest 我对库所做的大多数更改都有助于减轻Hamcrest的负担,因…

程序员鄙视链python_关于程序员之间的鄙视链

鄙视像条食物链,是个绕不开的怪圈。在这个怪圈中,每一个人,都在链条的最末端。朋友圈有鄙视链,相亲有鄙视链,程序员圈也有鄙视链看完下面的鄙视链,你是那一层?↓↓↓↓【1】努力成为全栈&#x…

java自定义jsp标签_自定义JSP标签

1 写一个标签处理类//标签处理类public class IpTag implements SimpleTag {private PageContext pageContext;//Web容器调用NO1public void setJspContext(JspContext pc) {System.out.println("setJspContext()");pageContext (PageContext) pc;}//Web容器调用NO2…

新手学习C语言编程的8个致命错误,你中招了吗?

序言C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”。但由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不…

java与java ee_Java EE拦截器

java与java ee历史 我认为重要的是要看一下Java EE中Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这一事实很简单。 版本1.0 拦截器最初是在EJB 3.0 (…

python怎么查询元素是否在列表中_python怎么判断某一元素是否在列表中

定义一个列表,并判断元素是否在列表中。python学习网,大量的免费python基础教程,欢迎在线学习!例如:test_list [ 1, 6, 3, 5, 3, 4 ]print("查看 4 是否在列表中 ( 使用循环 ) : ")for i in test_list:if(i…

python中带附件发送电子邮件_python发送带附件邮件

Python SMTP发送邮件SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。Python创建 SMTP 对象…

jpa 实体图查询_JPA实体图

jpa 实体图查询JPA 2.1的最新功能之一是可以使用实体图指定获取计划。 这很有用,因为它允许您自定义使用查询或查找操作检索的数据。 在使用中大型应用程序时,通常以不同的方式显示来自同一实体的数据。 在其他情况下,您只想选择最小的信息集…

C语言程序控制语句——while

while语句while (表达式) 语句当表达式为非0值(真)时,执行while循环体中的语句,如此往复,直到表达式的值等于0(假),循环结束。如以下示例程序,循环…

kettle 资料_Kettle的使用-初级

本文从kettle的简介、下载、安装、初级使用来展开。1.kettle是什么?kettle是一款开源的ETL工具。可以运行在Windows和linux上。2.下载地址https://community.hitachivantara.com/s/article/downloads3.安装因为Kettle是基于Java开发的,所以要先安装jdk环…

python抢货程序_写个Python程序上下班抢个顺风单

#!/usr/bin/python# -*- coding: gb2312 -*-##########################################################################2015-12-11 09:47:46#author: 358275018qq.com#使用Python2.6/7######################################################################### 有些库没…

C语言 | 语句概述

C语言语句的作用和分类1、9种控制语句if()...else.. //条件语句 for()... //循环语句 while()... //循环语句 do...while() //循环语句 continue //结束本次循环语句 break //中止执…

react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

react性能优化方案在我以前的文章中,我研究了一个虚拟的交易引擎,并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾,我写道: 我怀疑随着Node.js的最近成功,越来越多的异步Java库将…