您的位置:首页 > 编程语言 > C语言/C++

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

2016-09-02 17:42 501 查看
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 外面的,外来的意思。可以置于函数前或变量前,标识变量或函数可能不存在与本文件中,而是定义在别的文件,提示编译器遇到此变量是在其他模块中寻找定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言
相关文章推荐