static局部变量(静态局部变量的用法)

  有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的储存单元不释放,在下一次调用此函数时,该变量已经有值(就是上一次函数调用结束时的值)。这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明。通过下面的例子可以了解它的特点:

#include <stdio.h>
int main() {
	int f(int);
	int a=2,i;
	for(i=0; i<3; i++) {
		printf("%d\n",f(a));//这里的f(a)换为f(i)就又是一道题目哦
	}
	return 0;

}
int f(int a) {
	auto  int b;
	static int c=3;
	b++;
	c++;
	return (a+b+c);
}

分析:

第一次调用结束后,由于c被定义为静态局部变量,在函数调用结束后,它并不释放,保留c的值为4,同样第二次,第三次分别是5和6。c的储存空间不会释放。而b由于为auto型,所以每次调用函数结束以后都会释放储存空间。

说明:

1,静态局部变量属于静态储存类别,在静态储存区内分配储存单元。在整个程序运行期间都不释放。而自动变量(级动态局部变量)属于动态储存类别,分配在动态储存区空间而不在静态储存空间,函数调用结束后即释放。

2, 对于静态局部变量是在编译时赋值的,即只赋初值一次,在程序运行时它已有初值,以后每次调用函数时不在重新赋值而只是保留上次函数调用结束时的值。而对于自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3,如果在定义局部变量时不赋值的话,则对静态局部变量来说,编译时自动赋初值0(对于数值型变量)或空字符‘\0’(对字符变量)。而对自动变量来说,它的值是一个不确定的值。当然也可能是0,这是由于每次函数调用结束后储存单元已释放,下次调用时又重新另分配储存单元,而所分配的的单元中的内容是不可知的。

4,虽然静态局部变量在函数调用结束后任然存在,但其他函数是不能引用它的,因为他是局部变量,只能被本函数引用,而不能被其他函数引用。

总结:

  1. 记忆性
  2. 仅在本函数中使用

有什么不足的地方欢迎各位大佬指正

操作系统:Windows10

软件:Devc++

编译器:TDM-GCC 4.9.2 64-bit Release

### C/C++ 中 `static` 局部静态变量的作用和用法 #### 定义与初始化 在 C 和 C++ 编程语言中,当在一个函数内部使用 `static` 关键字修饰局部变量时,则该变量被称为局部静态变量。这种类型的变量具有特定的行为模式,在首次执行到其定义处时完成一次性的初始化操作,并在整个程序运行期间保持存在。 ```cpp void exampleFunction() { static int counter = 0; // 只会在第一次调用此函数时初始化 } ``` #### 生存周期 不同于常规的自动存储期(automatic storage duration)局部变量——它们通常只存在于所在代码块被执行的时间范围内;而带有 `static` 声明符的局部变量拥有静态生存周期(static storage duration),意味着这些对象自程序启动之初就被分配内存空间直至整个应用程序终止之前都不会释放[^2]。 #### 作用域 尽管如此, 这些静态局部变量仍然遵循着原本由其所处位置所限定的作用范围规则。也就是说,即使它们能够持续存活至进程结束,但访问权限依然局限于声明它们的那个具体函数体内或复合语句内[^3]。 #### 初始化特性 对于整型和其他内置数据类型而言,默认情况下未显式赋初值的话会被隐含设置成零值(zero-initialized)。而对于类类型(class type)的对象来说,如果提供了默认构造器(default constructor), 则会按照相应的方式来进行实例化处理[^1]。 #### 实际应用案例展示 下面通过一段简单的例子来说明如何利用这一机制实现计数功能: ```cpp #include <iostream> using namespace std; // 函数原型声明 void countCalls(); int main(){ for(int i=0;i<5;++i){ countCalls(); } } void countCalls(){ static unsigned callCount = 0; ++callCount; cout << "This function has been called " << callCount << " times." << endl; } ``` 上述代码片段展示了每次调用 `countCalls()` 方法都会使其中定义的一个名为 `callCount` 的静态局部变量增加并打印当前累计次数的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值