【c语言】static关键字的三种用法

您所在的位置:网站首页 大脑皮层表面积越大延缓兴奋传导速率 【c语言】static关键字的三种用法

【c语言】static关键字的三种用法

2023-09-15 08:43| 来源: 网络整理| 查看: 265

文章目录 1.修饰局部变量1)局部变量的简单了解a)registerb)autoc)static 2.修饰全局变量3.修饰函数

1.修饰局部变量 1)局部变量的简单了解

局部变量按照存储形式来分,分为auto,static,register,存储在栈上,当函数结束时,随之释放。

a)register register为寄存器变量,存放在寄存器里面,调用速度快,在c语言中register变量不能取地址,会报错。而在c++中,对register做了增强,当C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。 1.声明变得register 关键字指明局部变量存储与寄存器中 2.register 变量必须是CPU寄存器可以接受的值 3.不能用&运算符获取register变量的地址 b)auto auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上 c)static static修饰局部变量时该`变量是存放在静态存储区(代码段),生命周期是整个程序结束。`static局部变量初次定义时就要初始化,且只能初始化一次。如果在定义的时候不初始化,编译器就会自动赋值为0;(也就是说如果重复调用同一个函数,在第二次调用时,就不会再执行static局部变量初始化那句话 了) static局部变量具有”记忆性”与生存期的”全局性” 所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.

注意事项:

“记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.这在多线程编程时可能会成为一种隐患。需要多加注意。 eg: void test() { int i = 0; i++; printf("%d\n", i); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } system("pause"); return 0; }

程序运行结果为10个1,加上static后

void test() { static int i = 0; i++; printf("%d\n", i); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } system("pause"); return 0; }

运行结果为:1 2 3 4 5 6 7 8 9 10 分析: static创建i,i不会被销毁,生命周期变长但是作用域并没有改变。 局部变量存在栈区,栈区数据自动创建,自动销毁,static变量存在静态区,(静态区的数据创建了但不销毁),所以static是先改变了变量的存储位置,从而改变了它的生命周期。 在这里插入图片描述 2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 ---- 不可重入性

2.修饰全局变量

改变了链接属性(外->内) 当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在代码段(已初始化)或者BSS段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。

3.修饰函数

改变了链接属性(外->内) C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。

static修饰全局变量或者函数时,不是为了限制其存储方式,而主要是为了限制该全局变量或者函数的作用域仅限于本文件,所以又称为内部函数。此件时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文)内部.使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3