C语言之const,#define,static,volatile
const
1.被const修饰的变量具有了只读属性
const int a; //常整数型
int const a; //常整数型
IAR5.5 MSP430F4793实践(硬件仿真):
const修饰的局部变量看上去并无特别之处,存放的地方也是在栈上,用完就释放了:
自增操作编译报错,说明还是有只读的特性:
但是如果把它拿到函数体外,那存放位置就变成只读数据段了;
2.const int * a 与 int * const a 的定义与区别
const int *a; //a是一个指向常整数型的指针
int * const a; //a是一个指向整数型的常指针
const int const*a; //a是一个指向常整数型的常指针
先说const int *a :
a认为它是一个常整型数,是不可以直接修改的,但是a确实一个指针变量,于是可以通过修改a的指向或者其指向的变量的值来修改a;
然后是int * const a, a是变量,a是常量;
最后是const int consta ,*a是常量,a也是常量;
#define
1.求最大值和最小值
#define MAX( x, y ) (((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) (((x) < (y)) ? (x) : (y) )
2.得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
3.得到一个字的高位和低位字节
#define WORD_LO(xxx) ((byte) ((word)(xxx) & 255))
#define WORD_HI(xxx) ((byte) ((word)(xxx) >> 8))
4.返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
5.将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
6.判断字符是不是10进值的数字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
7.判断字符是不是16进值的数字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||/
((c) >= 'A' && (c) <= 'F') ||/
((c) >= 'a' && (c) <= 'f') )
static
关键词static的作用:
1.在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2.在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问,它是一个本地的全局变量;
3.限定作用域;
总结:被static修饰的变量是一个被限定作用域的全局变量;
实践:变量a1在多个地方声明,并没有报错
volatile
1.并行设备的硬件寄存器(如:状态寄存器);
2.一个中断服务子程序中会访问到的非自动变量;
3.多线程应用中被几个任务共享的变量;
提问:
1.一个参数既可以是const还可以是volatile吗?
答:是的,例如一个只读的状态寄存器,它是volatile因为它可能被意想不到的改变。它是const因为程序不应该试图去修改它;
2.一个指针可以是volatile吗?为什么?
答:编译器为了加快存取速度,会将一个变量存到寄存器中,下次调用时直接读取寄存器中的值,但是这个变量可能会被中断服务函数改变,或者其他硬件层次的改变,而编译器是察觉不到的,使用volatile可以避免这种问题;