c语言中auto,static,register,const,volatile,extern认识与理解

auto
auto关键字在我们写的代码中几乎是看不到的,但它却如此的重要,无处不在。它用来声明变量的生存期是自动的,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。编译器在默认的缺省情况下,所有变量都是auto,你就当他不存在吧
static
修饰变量,他们都存在内存的静态区。
(1)修饰全局变量(静态全局变量):静态全局变量与其他的全局变量存在的位置一样,但它的作用域仅限于变量被定义的的文件中,其他文件即使用extern声明的也没办法使用它。可以说作用域从定义之处开始,到文件结尾处结束,再定义之处前面的代码也不能使用。
(2)修饰局部变量(静态局部变量):在函数体里面定义的,就只能在函数里用,其他的函数用不了。由于被static修饰的变量存在于静态区,当函数运行结束时,静态变量不会被销毁,函数下次使用的仍然能用到这个值变量的生命周期变长

static int j;
int  fun1(void)
{
  static int i=0;//static定义的局部变量i++后并不会销毁,函数下次继续使用
  i++;

}
int fun2(void)
{
   j=0;//j是static定义的全局变量,下次使用时还是+
   j++;
}

修饰函数
函数前面加static使得函数成为静态函数,其作用域仅限本文件(内部函数)
使用内部函数,就不用担心自己定义的函。是否与其他文件的函数同名。
register 最快的关键字,register修饰的变量存在cpu的内部寄存器中,而不是通过内存寻址访问,提高了效率。注意是 尽可能,不是绝对
register变量必须是一个单个的值,并且其长度应小于或等于整形的长度。而且register变量可能不存在内存中,所以不能取址“&“来获取变量的地址。
const
const修饰的变量为只读变量,具有不可变性。节省空间,避免不必要的内存分配,同时提高效率。编译器通常不为普通const只读变量分配存储空间,而是把他们保存在符号表中,这使它成为一个编译期间的值,没有存储与读内存的操作,使得效率提高。

1.修饰一般变量

int const m=1;
const int m=1;

2.修饰数组

int const arr[4]={1,2,3,4};
const int arr[4]={1,2,3,4};

3.修饰指针

const int *p;//p可变,p指向的对象不可变
int const *p;//p可变,p指向的对象不可变
int *const p;//p不可变,p指向的对象可变
const int* const p;//指针p和p指向的对象都不可变
//注:忽略类型名,const离哪个近。“近水楼台先得月”,里谁近就先修饰谁。

4.修饰函数的参数

void fun(const char str);
//告诉编译器str不可被改变

5.修饰函数的返回值
const修饰的函数的返回值不可被改变
volatile
volatile 是易变的,不稳定的意思。volatile修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等。编译器对该变量的代码就不再进行优化,从而可以提高对特殊地址的稳定访问。
extern
extern 外面的,外来的意思。可以置于函数前或变量前,标识变量或函数可能不存在与本文件中,而是定义在别的文件,提示编译器遇到此变量是在其他模块中寻找定义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值