1. static
(1) static声明变量
声明局部变量:可以使局部变量值在函数掉用后不消失,即起占用的存储单元不释放
特点------只能被本函数调用,(因此,声明为静态变量只能扩大函数的
生存周期,而不能扩大生存范围)
声明外部变量:可以限制外部变量只被本文件(.C文件)引用.(同上面的声明达到了同
样的效果,不过生存范围被相对缩小)
(2) static声明函数
只能在本文件中被使用的函数;如果在不同文件中有相同的函数,互不干扰.
(3) 例 (声明局部变量)
main()
{
int a = 2,i;
for(i = 0;i < 3;i++)
printf(“%d”,f(a));
}
f(int a)
{
int b = 0;
int static c = 3;
b = b + 1;
c = c + 1;
return(a+b+c);
}
运行结果:7 8 9
2. const
const 限定一个变量为只读变量.
(1) const在C和C++中的区别
>>
const int n = 5;
int a[n];
在ANSI C中以上程序是错误的,因为只读变量不等于常量. 常量只能”只读”,在内存空间中没有
被分配内存;而”只读变量”是要在内存中开辟空间来存放其值的,但是这个值由编译器限定,不许
修改,编译器在编译时并不知道它在编译时的值.
在C++中以上程序是正确的,
>>
const int n;
在ANSI C中这是正确的,C编译器把它当作一个声明,认为在别处为其分配了空间
在C++中这是错误的.如果不初始化,则必须改为extern const int n,才能通过编译
另外C++ 编译器一般也不为CONST分配存储空间,而是将其放入符号表,以加快编译速度.
(2) const在指针中的应用
int b =500
int const int* a = &b //内存地址不固定,但内存中存放的数据固定
int const *a =&b //同上
int* const a =&b //内存地址固定但内存中存放的数据不固定
const int* const a = &b //内存地址固定,内存中存放的数据固定
总结:
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常
量
3. volatile
本意是易变的,瞬时的.用它声明的类型变量可以被某些编译器的未知因素更改.
例1.
volatile int i = 10;
int a = i;
…
int b = i;
编译器优化的做法是,由于编译器两次从 i读数据的代码之间没有对i进行多操作,它会自动把上次读的
数据放在b中.而不是从i的内存中读.这样,如i一个既存器变量或者表示一个端口数据就容易出错.
加了volatile则表明i是随时可能发生变化的,每次使用的时候必须从I的内存地址中度区,因而编译器产
生的汇编代码会从i的地址读取数据放到b中.
例2.
void main()
{
volatile int i=10;
int a = i;
printf("i= %dn",a);
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %dn",b);
}
debug 模式下运行结果如下:
i = 10
i = 32
Release 模式下运行结果如下:
i =10
i = 10