C语言之const,#define,static,volatile

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 const
a ,*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可以避免这种问题;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值