关键字
#和##
- #:字符串化操作符
宏定义中的传入参数名转化成用一对双引号括起来参数字符串。 - ##:符号连接操作符
volatile
加上这个关键字,是防止编译器去做优化的操作。
三个例子:
1.并行设备的硬件寄存器
在读写的时候,需要告诉这个变量是不稳定的,编译的时候不需要优化。(不需要优化的意思就是去特殊地址去访问它)。
2.中断服务程序中修改的供其它程序检测的变量,需要加volatile
当变量在触发中断中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。
3.多线程应用中被几个任务共享的变量,应该加上volatile:
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,编译器会逐一的进行编译并产生相应的机器代码(产生四条代码)。
static
可以从两个点去回答:
- 一个静态局部变量,在函数体内,只会初始化一次(具有记忆功能),可参考这个例子。链接: link在函数调用中是维持初始化不变的。
2.另外一点事全局静态变量,在函数体外,作用的范围是该.c文件下的所有的函数访问,但是不能被外部.c文件访问。
它在函数内的话,一般函数内的话一般声明周期会很长,与程序同生死。和函数内的局部变量是不同的,局部变量存储在栈中,一旦函数调用结束,就立刻销毁了。
auto
只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。
const
-
概念:
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 -
与define的区别
第一,const常量一般是有数据类型的,编译器可以做安全检查;但是define是没有类型的,它是一种简单的替换方法,编译器不能做安全检查。
第二,在内存分配上,const是给出的是对应的内存地址,而define是一个立即数。程序运行中,const定义的常量只有一份拷贝,但是define定义的常量在内存中有若干拷贝。
内存
内存分配有哪些?
略
什么是内存泄漏
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
指针
-
指针数组与数组指针的区别
指针数组:链接: link数组指针:链接: link
-
函数指针与指针函数
2.1 函数指针:
如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。int(*p)(int, int); p = MAX; int MAX(int x ,int y);
2.2 指针函数:
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
int *pfun(int, int);
指针和引用
待整理……