01
void 与 void*
C语言中,void为不确定类型,不可以用来声明变量。如void a=10;是错的。但是可以把指针定义为void类型,如void* ptr。
void*是步长未定的指针类型。一般用在函数参数、函数返回值中需要兼容不同指针类型的地方;void*类型变量可以接受任意类型指针的赋值,并且不需要进行强制类型转换。void*可以赋值给任何类型的变量,但是需要强制类型转换结果才有意义。
例如:
02
volatile 关键字
volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。可见性即用volatile关键字修饰的成员变量表明该变量不存在工作线程的副本,线程每次直接都从主内存中读取,每次读取的都是最新的值,这也就保证了变量对其他线程的可见性。另外,使用volatile还能确保变量不能被重排序,保证了有序性。
03
数据占用大小
数据占用大小是指不同的数据类型在平台中所占用的字节个数,不同的平台不同类型占用的字节个数稍有不同,不过在对应的平台进行开发过程中,必须要对每个数据类型的占用大小了如指掌,否则各种数据溢出,数据越界等等接踵而来。下面是简单罗列的一些数据占用情况:(在一般32位PC中)
04
const 与指针
我们知道const关键字修饰的是不可变量,将它和指针一起使用,会有很多微妙的地方。主要的识别办法是去掉数据类型,看const修饰的是哪部分。
关于使用const来修饰指针,有两种不同的方式。第一种是让指针指向一个常量对象,这样可以防止使用该指针进行修改指向的值。第二种则是将指针本身声明为常量,可以防止改变指针指向的位置。
05
结构体与共联体
对于结构体和共联体在嵌入式领域是使用得非常频繁的,一些可编程芯片提供的寄存器库都是采用结构体和共联体结合的方式来提供给软件人员进行开发,同时在平时的编码过程中这两个数据类型的灵活应用也能够实现代码更好的封装与简化。
如下面的简单示例,就可以非常灵活的访问Val中的bit位。
06
预定义标识符
一般编译器都支持预定义标识符,这些标识符结合printf等打印信息帮助程序员调试程序是非常有用的,一般编译器会自动根据用户指定完成替换和处理。
如下是常用的标识:
__FILE__ :表示进行编译的源文件字符串;__LINE__ :表示当前文件的行号;
__DATE__:表示文件日期;
__TIME__ :表示文件时间;
使用范例:
07
# 与 ##
#:是一种运算符,用于带参宏的文本替换,将跟在后面的参数转成一个字符串常量。
##:是一种运算符,是将两个运算对象连接在一起,也只能出现在带参宏定义的文本替换中。
领取专属 10元无门槛券
私享最新 技术干货