网站流量建设,科技软件,毕业设计开发网站要怎么做,中企动力双语网站文章目录前言一#xff0c;static关键字的作用二#xff0c;const 关键字的作用2.1#xff0c; 修饰局部变量2.2#xff0c;修饰指针2.3#xff0c; 修饰函数形参2.4#xff0c;修饰函数的返回值三#xff0c;volatile关键字的作用前言
面试的时候#xff0c;C语言最常…
文章目录前言一static关键字的作用二const 关键字的作用2.1 修饰局部变量2.2修饰指针2.3 修饰函数形参2.4修饰函数的返回值三volatile关键字的作用前言
面试的时候C语言最常问的三个关键字static、const、volatile的作用你是否能回答完整呢 一static关键字的作用
修饰局部变量会改变局部变量的生命周期不改变作用域(在函数执行完后该静态局部变量还在不会被释放但不能在其它地方使用)静态局部变量的初始化只会执行一次修饰全局变量表示该全局变量只能在本文件使用不能跨文件使用修饰函数表示该函数只能在本文件中使用不能跨文件使用
static修饰的变量存放在静态存储区会默认初始化为0而且修饰的全局变量和函数只能在本文件中使用可防止重名。
二const 关键字的作用
const 是 constant 的缩写意思是“恒定不变的”用来定义只读变量的或者说 const 是定义常量的关键字
2.1 修饰局部变量
被修饰变量的值不能改变。用const修饰变量时一定要给变量初始化否则之后就不能再进行赋值了。
const int i 10; //正确
int const i 10 // 正确这两种写法是等价的
i 20; //错误常量值不可被改变
const int j; //错误未被初始化2.2修饰指针
可以指定指针本身为const也可以指定指针所指的数据为const 常量指针本质上是个指针指针指向的内容是常量指针本身是可以变的可指向其他地址
int a 5;
int b 10;
const int* n a;
int const* n a; //这两种定义方式都是一样的表示常量指针
*n 6; //错误不能改变 n所指向对象的值
a 6; //正确不能通过这个指针改变变量的值但是还是可以通过其他的引用来改变变量的值的。
n b; //正确常量指针指向的指不能改变但指针可变可指向其他地址指针常量本质上是个常量表示常量是个指针类型不能再指向其他的地址指向的内容可变
int nValue1 10;
int nValue2 20;
int* const constPoint nValue1;
//constPoint nValue2; //错误不能改变constPoint本身的值
*constPoint 40; //正确可以改变constPoint所指向的对象此时nValue1 40指向常量的常指针 是以上两种的结合指针指向的位置不能改变并且也不能通过这个指针改变变量的值但是依然可以通过其他的普通指针改变变量的值。
const int nConstValue1 5;
const int nConstValue2 15;
const int* const pPoint nConstValue1;
//*pPoint 55; //错误不能改变pPoint所指向对象的值
//pPoint nConstValue2; //错误不能改变pPoint本身的值const助记方法 把一个声明从右向左读。( * 读成 pointer to )
char * const cp; // cp is a const pointer to char
const char * p; // p is a pointer to const char;
char const * p; // 同上2.3 修饰函数形参
根据常量指针与指针常量const修饰函数的参数也是分为三种情况
防止修改指针指向的内容 void StringCopy(char* strDes, const char* strSrc); 其中 strSrc是输入参数strDes是输出参数。给 strSrc 加上 const 修饰后如果函数体内的语句试图改动 strSrc 的内容编译器将指出错误。防止修改指针指向的地址
void swap ( int* const p1 , int* const p2 )指针p1和指针p2指向的地址都不能修改。
以上两种的结合。
void swap ( int* const p1 , const int* const p2 )2.4修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰那么函数返回值即指针的内容不能被修改该返回值只能被赋给加const 修饰的同类型指针。 举个例子
const char* GetString(void);
char* str GetString(); // 错误会出现编译错误
const char* str GetString(); // 正确类型要一致三volatile关键字的作用
volatile 本意是“易变的”指变量是随时可能发生变化的。系统总是重新从它所在的内存读取数据即使它前面的指令刚刚从该处读取过数据。即变量前加这个关键字编译器对访问该变量的代码就不再进行优化从而可以提供对特殊地址的稳定访问
存储器映射的硬件寄存器一个中断服务程序中修改的供其它程序检测的变量多线程中各任务间共享的变量可以关闭系统调度 这几种情况经常还要同时考虑数据的完整性相互关联的几个标志读了一半被打断了重写在a)中只能依靠硬件的良好设计b)中可以通过关中断来实现c)中禁止任务调度。
编译器的优化 在本次线程内, 当读取一个变量时为提高存取速度编译器优化时有时会先把变量读取到一个寄存器中以后再取变量值时就直接从寄存器中取值当变量值在本线程里改变时会同时把变量的新值copy到该寄存器中以便保持一致。 当变量在因别的线程等而改变了值该寄存器的值不会相应改变从而造成应用程序读取的值和实际的变量值不一致。 当该寄存器在因别的线程等而改变了值原变量的值不会改变从而造成应用程序读取的值和实际的变量值不一致。 其他问题 1)一个参数既可以是const还可以是volatile吗 可以的例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。 2) 一个指针可以是volatile 吗 可以当一个中服务子程序修该一个指向一个buffer的指针时。