请问在C语言中,auto和static分别代表啥意思,有啥作用,谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问在C语言中,auto和static分别代表啥意思,有啥作用,谢谢相关的知识,希望对你有一定的参考价值。
c语言中变量一共有四种变量存储类,分别为:auto(自动变量)
register(寄存器变量)
static(静态变量)
还有一个是外部变量。
你可以去百科一下了解详细情况。 参考技术A register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在cpu的寄存器中,以加快其存储速度。
const限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
static关键字分别在C和C++中的作用
- static用于实现多个对象之间的数据共享 + 隐藏
- 使用静态成员不会破坏隐藏规则
- 默认初始化为0
1. C语言中static的特性(面向过程设计中)
- 局部变量:在任意一个函数内部定义的变量(不加static),初始值不确定,出函数自动销毁,存放于栈区。 使用static修饰这个变量时,编译器会把她初始化为零,存储于静态区,函数返回时值保持不变,出函数不销毁,下一次进入函数依然存在。根本原因 —— static修饰的局部变量存储在静态区。
静态局部变量的特点:
- 在全局数据区分配;
- 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
- 作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。
-
全局变量 :普通全局变量定义在函数体外部,在静态区分配存储空间,编译器自动对其初始化。普通全局变量对整个工程可见,其他文件使用关键字extern外部声明后可以直接使用。 静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
-
函数:在函数的返回类型前加上static,就是静态函数。例如:static int main() 静态函数只能在声明它的文件可见,其他文件不能引用该函数。不同文件可以使用相同名字静态函数;非静态函数可以在另一个文件直接引用。
-
为什么需要静态全局变量?
一般在函数中定义的变量,在栈区分配空间,函数退出时胡自动释放,无法保存,而如果定义全局变量来实现,变量就不属于函数本身,不在仅受函数控制,给程序维护带来不便;利用静态全局变量可将其保存在全局数据区,每次值保持到下一次调用,直到下次赋新值。
2. C++中static的特性(面对对象设计中)
-
类内静态成员变量
静态数据成员的特点:
- 静态数据成员被当做类成员,无论这个类的对象被定义多少个,静态数据成语在程序中只有一个拷贝,由该类型所有对象共享访问,只分配一次内存;
- 存储在全局数据区,静态数据成员定义时要分配空间,所以不能在类声明中定义在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;
- 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
- 类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
-
静态数据成员主要用在各个对象都有相同的某项属性的时候
-
同全局变量相比,使用静态数据成员有两个优势:
- 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
- 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
以上是关于请问在C语言中,auto和static分别代表啥意思,有啥作用,谢谢的主要内容,如果未能解决你的问题,请参考以下文章
未在定义语句中赋初值的auto变量和static变量的初值都是随机值。请问这句话错在哪里?