static静态变量

合集下载

static在c语言中用法

static在c语言中用法

static在c语言中用法static在C语言中的用法C语言是一种广泛应用于系统级编程的编程语言,因其简洁、高效的特点而被广泛采用。

其中,static是C语言中的一个关键字,具有多种用法和功能。

本文将逐步介绍static关键字在C语言中的不同用法和作用。

1. 静态变量static关键字可以用于声明静态变量。

静态变量与普通变量的不同之处在于,它们的生存周期会持续到整个程序的执行过程中,而不仅限于函数调用期间。

在函数内部使用static关键字声明的变量,其值会在函数调用结束后依然保持,下次函数调用时仍然可用。

以下是一个示例:c#include <stdio.h>void increment() {static int counter = 0;counter++;printf("Counter: d\n", counter);}int main() {increment();increment();increment();return 0;}运行结果将会输出:Counter: 1Counter: 2Counter: 3可以看到,每次调用increment函数时,静态变量counter的值都会保持,并在下次调用时继续递增。

2. 静态函数static关键字还可以用于声明静态函数。

静态函数与普通函数的区别在于,静态函数仅在声明它的源文件中可见,无法被其他源文件所调用。

这种封装的特性使得静态函数在模块化编程中起到了一定的作用。

以下是一个示例:c文件1:test1.c#include <stdio.h>static void static_function() {printf("This is a static function.\n");}void normal_function() {printf("This is a normal function.\n");}文件2:test2.cvoid normal_function();int main() {static_function(); 错误,static_function无法被该源文件所调用normal_function(); 正确,normal_function是全局函数return 0;}在上述示例中,test1.c声明了一个静态函数static_function()和一个全局函数normal_function(),而test2.c只能调用全局函数normal_function(),而无法调用静态函数static_function()。

静态变量(static)的特点

静态变量(static)的特点

静态变量(static)的特点
静态变量(static):有局部变量,也有全局变量。

静态局部变量:在函数体内⽤static说明的变量称为静态局部变量,属于静态类别。

特点:
(1)它占据⼀个永久性的存储单元。

随着⽂件的存在⽽存在。

(2)静态局部变量是在编译时赋初值,在程序执⾏期间,⼀旦存储单元中的值改变,就不会再执⾏赋初值的语句。

未赋初值的变量其值为0。

#include "stdio.h"
int f(int a)
{
int b=0;
static int c=3;//有static和没有static的输出结果不⼀样
b=b+1,c=c+1;//有static输出7 8 9 ,没有static输出7 7 7
return (a+b+c);
}
int main()
{
int i,a=2;
for(i=0;i<3;i++)
printf("%d\n",f(a) );
return 0;
}
#include "stdio.h"
int fun(int n)
{
static int f=1;
f=f*n;
return f;
}
int main()
{
int i;
for(i=1;i<=5;i++)
printf("%d\n",fun(i) );
return 0;
}
//输出结果是1 2 6 24 123。

c语言的static用法

c语言的static用法

c语言的static用法在C语言中,static是一个非常重要的关键字,它可以用于变量或者函数的声明中,起到了不同于其他关键字的作用。

下面将探讨C语言中static的用法。

一、静态变量的声明与使用静态变量是在程序执行期间一直存在的变量,它的作用范围仅限于当前的函数或者文件。

在C语言中,我们可以通过在变量声明前加上static关键字来定义静态变量。

例如,我们想在一个函数中统计该函数被调用的次数,可以声明一个静态变量来实现:```cvoid function() {static int count = 0; // 静态变量count的初始值为0count++; // 每次调用函数,count加1printf("函数被调用了%d次\n", count);}```在上面的代码中,count是一个静态变量,它在函数每次被调用时都会保留上一次调用后的值。

如果count是一个普通的局部变量,每次函数调用完毕后都会被销毁,无法实现计数的功能。

静态变量的作用域仅限于当前函数或者文件,也就是说,如果在其他函数或者文件中声明相同名字的静态变量,它们不会相互影响。

二、静态函数的声明与使用与静态变量类似,我们还可以使用static关键字来声明静态函数。

静态函数只能在声明的文件中使用,不能被其他文件调用。

例如,我们有两个文件file1.c和file2.c,其中file1.c中定义了一个静态函数,file2.c中想调用这个函数是无效的。

file1.c:```cstatic void static_function() {printf("这是一个静态函数\n");}```file2.c:```c#include <stdio.h>int main() {static_function(); // 错误,无法调用file1.c中的静态函数return 0;}```静态函数可以保证函数的私有性,避免其他文件对该函数的访问和使用。

静态变量static的用法

静态变量static的用法

静态变量static的用法一、概述静态变量是一种变量类型,在编程语言中广泛应用。

它具有特殊的作用和特点,可以用来存储和共享数据。

静态变量在程序运行之初就被分配内存,并在整个程序运行期间保持不变。

本文将详细探讨静态变量的用法及其特点。

二、静态变量的定义和声明静态变量是使用static关键字定义的变量。

静态变量可以在类中或者函数中声明和定义,具体取决于其使用范围的需求。

类中的静态变量在类中声明的静态变量是类的成员,所有此类的对象都会共享这个静态变量。

使用静态变量可以在多个对象之间共享数据,这在一些场景中非常有用。

public class MyClass {static int count;}以上代码中,count是MyClass类的一个静态变量,所有MyClass的对象都可以读取和修改这个变量。

函数中的静态变量在函数中定义的静态变量仅在函数内部可见,但是它的生命周期延长至整个程序运行期间。

函数中的静态变量只会被初始化一次,即在第一次调用函数时。

void myFunction() {static int num = 0;num++;System.out.println("变量num的值为:" + num);}以上代码中,num是函数myFunction()中的一个静态变量,它在每次调用函数时都会自增并打印出来。

三、静态变量的特点和优势静态变量具有以下几个特点和优势:1. 共享数据静态变量在多个对象之间共享数据。

这意味着所有对象可以访问和修改同一个静态变量,从而达到数据的共享和统一管理。

2. 生命周期长静态变量的生命周期从程序开始到结束。

它在程序启动时被初始化,在整个程序运行期间可以被多次访问和修改,直到程序结束时才被释放。

3. 可以直接访问静态变量可以直接通过类名访问,无需创建对象。

这样可以方便地使用静态变量,而无需创建对象实例。

4. 方便管理全局数据静态变量可以作为全局数据的容器,在程序中存储一些全局配置或者状态信息。

static 用法

static 用法

static 用法static 用法1. static 变量•定义:在函数内部使用 static 关键字声明的变量称为静态变量。

•特点:–静态变量的生命周期在整个程序运行期间都存在,而不仅仅在函数调用时才存在。

–静态变量存储在静态存储区,不会在函数调用结束后释放内存。

•使用场景:–如果一个变量需要在多次函数调用之间保持其值不变,可以使用静态变量。

–静态变量通常用于计数器或者保存函数的返回值等场景。

•示例代码:#include <>int count() {static int counter = 0;counter++;return counter;}int main() {printf("%d\n", count()); // 输出1printf("%d\n", count()); // 输出2printf("%d\n", count()); // 输出3return 0;}2. static 函数•定义:在函数返回类型前面加上 static 关键字,使函数变为静态函数。

•特点:–静态函数只能在声明它的源文件内部调用,不能被其他源文件使用。

–静态函数不能被其他源文件中的函数调用,从而起到了隐藏的作用。

•使用场景:–当某个函数只在当前源文件内部使用时,可以将其声明为静态函数,以减少命名冲突和提高代码的模块化程度。

•示例代码:#include <>static int multiply(int a, int b) {return a * b;}int main() {int result = multiply(2, 3);printf("%d\n", result); // 输出6return 0;}3. static 类成员•定义:在类中声明的 static 成员属于类本身,而不是类的实例。

•特点:–所有的对象共享同一个静态成员,即静态成员对于所有的对象来说只有一份拷贝。

c语言静态变量static清零

c语言静态变量static清零

c语言静态变量static清零C语言是一种广泛应用于软件开发的编程语言,而静态变量(static)是C语言中一个重要的概念。

在程序运行过程中,静态变量的值会一直保持到程序结束,并且在每次调用函数时不会重新初始化。

本文将详细介绍C语言中静态变量的特性以及如何清零静态变量的方法。

在C语言中,声明一个静态变量只需要在变量名前加上关键字static。

静态变量与普通的局部变量不同,它的生命周期更长,不会随着函数的调用而释放。

静态变量的一个重要特性是在函数调用时不会重新初始化,即使函数被多次调用,静态变量也只会被初始化一次。

这使得静态变量在多次函数调用中保持了持久性,可以在函数多次调用时共享数据。

要清零静态变量,可以使用赋值操作符将其值设置为0。

在函数内部,可以通过赋值语句将静态变量的值重置为0,从而达到清零的效果。

例如,可以使用以下代码清零一个静态变量:```cvoid resetStaticVariable() {static int count = 0;count = 0; // 清零静态变量}```在上述代码中,函数`resetStaticVariable`中声明了一个静态变量`count`,并将其初始化为0。

然后,通过将`count`赋值为0,即可将静态变量清零。

静态变量的另一个特性是作用域仅限于声明它的函数内部。

这意味着其他函数无法直接访问该静态变量,从而确保了数据的封装性和安全性。

只有声明了静态变量的函数才能对其进行操作和修改。

除了在函数内部使用静态变量,静态变量也可以在全局范围内使用。

在全局范围内声明的静态变量与函数内部的静态变量有所不同。

全局范围的静态变量在整个程序的生命周期内都是可见的,但其作用域仅限于声明它的源文件。

这意味着其他源文件无法直接访问全局范围内的静态变量,从而保证了数据的私密性。

清零全局范围内的静态变量与清零函数内部的静态变量的方法相同,即通过赋值语句将其值设置为0。

例如,可以使用以下代码清零一个全局范围内的静态变量:```cstatic int count = 0; // 全局范围内的静态变量void resetStaticVariable() {count = 0; // 清零全局范围内的静态变量}```在上述代码中,全局范围内的静态变量`count`被初始化为0,然后在函数`resetStaticVariable`中将其赋值为0,实现了清零的效果。

函数里面定义的static变量

函数里面定义的static变量

函数中的静态变量特定函数在C++中,静态变量是一种与特定函数关联的变量类型,它与普通变量不同的是,静态变量的存储位置在程序的生命周期内保持不变,即使在函数调用结束后也不会销毁。

静态变量还具有特定函数的作用域,只在特定函数内部可见,并且不同的函数之间的静态变量是相互独立的。

我们可以使用static关键字来定义静态变量。

1. 静态变量的定义在函数内部使用static关键字定义的变量被称为静态变量。

语法格式如下:return_type function_name(parameters) {static variable_type variable_name;// 函数体}其中,function_name是函数的名称,parameters是函数的参数列表,return_type 是函数的返回类型,variable_type是静态变量的数据类型,variable_name是静态变量的名称。

例如,下面的示例代码定义了一个名为countCalls的函数,其中使用了静态变量count:#include <iostream>void countCalls() {static int count = 0;count++;std::cout << "This function has been called " << count << " times." << st d::endl;}int main() {countCalls();countCalls();countCalls();return 0;}输出结果为:This function has been called 1 times.This function has been called 2 times.This function has been called 3 times.2. 静态变量的特点和用途静态变量具有以下几个特点:2.1 存储位置固定静态变量的存储位置在程序的生命周期内保持不变。

static在c++语言中的用法

static在c++语言中的用法

static在c++语言中的用法static是C++中的一个关键字,用于定义静态变量和静态函数。

静态变量和普通变量的区别在于,静态变量存储在数据区,生命周期与整个程序运行时间相同,在程序运行时只会被初始化一次。

而普通变量在程序运行时会被重复初始化和销毁,生命周期与函数调用时间相同。

1. 静态变量静态变量可以声明在函数体内和类内部。

当静态变量声明在函数体内时,该变量只在此函数中可见,即使此函数被多次调用,静态变量只会被初始化一次。

当静态变量声明在类内部时,它属于整个类,不需要通过对象来访问,可以直接通过类名+范围解析符(::)来访问。

如:静态变量在类内部的声明可以用于实现单例模式。

如下代码实现了只能创建一个MyClass对象的单例模式:2. 静态函数静态函数的另一个用途是实现工厂模式。

当我们需要创建一些对象并且它们的类型在编译时不能确定时,可以使用工厂模式来创建这些对象。

静态函数可以作为工厂函数,用于创建对象的实例。

如下代码:3. 静态成员变量和静态函数的限制1. 静态成员变量需要在类外部进行初始化。

即使不进行初始化,编译器也会为它自动赋值为0。

2. 静态成员变量的访问权限可以是public、protected或private。

3. 静态成员变量可以在类声明中提供初值,如`static int myStaticVar = 0;`。

4. 静态函数不能声明为const,因为const只能用于成员函数,而静态函数没有对象,无法成为成员函数。

5. 静态函数可以被继承,但不能被override(覆盖),因为静态函数与类名绑定在一起,无法被子类的同名函数所覆盖。

但是,如果子类中声明一个与父类中静态函数同名的静态函数,它并不会覆盖父类中的静态函数,而是在子类中新增一个同名函数。

6. 静态函数不能访问非静态的成员函数和变量。

如果需要访问非静态成员,必须通过对象来调用成员函数。

但是,由于静态函数没有对象,无法调用非静态成员函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

static静态变量的理解
static静态变量的理解
静态变量类型说明符是static。

静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。

静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。

另外,属于静态存储方式的量不一定就是静态变量。

例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。

所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。

静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

静态变量并不是说其就不能改变值,不能改变值的量叫常量。

其拥有的值是可变的,而且它会保持最新的值。

说其静态,是因为它不会随着函数的调用和退出而发生变化。

即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

一、静态局部变量:
1、Static类内部变量同auto自动变量(即未加Static 声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。

倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。

换言之,Static
类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。

2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。

而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。

即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。

而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。

4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。

虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

example:
//考察静态局部变量的值。

#include<stdio.h>
int f(int a)
{
auto b =0;
static c =3;
b = b +1;
c =c+1;
return(a+b+c);
}
main()
{
int a =2,i;
for(i =0;i <3;i ++)
printf("%d\n",f(a));
}
//求1~5的阶乘。

/*
由于f为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。

若变量f说明为自动变量(去掉static),当main中多次调用factor时,f均赋初值为1,故每次输出值均为1。

*/
#include< stdio. h>
long factor(int n)
{
static long int f = 1;//static
f *= n;
return f;
}
main()
{
int i;
for( i = 1; i <= 5; i++)
printf("%ld\n", factor( i));
}
二、静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。

这两者在存储方式上并无不同。

这两者的区别虽在于:
1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。

2、静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件(即声明了该变量的CPP文件,或包含该变量声明头文件的CPP文件)中不能使用它。

由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。

把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

因此static这个说明符在不同的地方所起的作用是不同的。

应予以注意。

关于Static关键字
1.静态变量,分配在静态存储区,在数据段中。

函数退出之后,变量值不变。

2.作用域,全局的静态变量、静态函数只能在本文件中使用。

(不同于一般全局变量)
局部的静态变量同函数的局部变量
五大内存分区(貌似与编译原理中不一样,不过道理是一样的,实际存在的东西总是会与理论有一定差距的)
1.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

2.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。

里面的变量通常是局部变量、函数参数等。

3.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

4.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命的。

5.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变
量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

6.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
另外:
1)、static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。

这一点是它与堆栈变量和堆变量的区别。

2)、static静态变量用static告知编译器,自己仅仅在变量的作用范围内可见。

这一点是它与全局变量的区别。

——有信息隐蔽的作用。

(外部的Static声明亦可用于声明函数。

如果将函数声明为Static类型,则该函数名除了对该函数声明所在的文件可见外,其他文件均无法访问。


3)、若全局变量仅在单个C文件中访问,则可将此变量改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可将此变量改为该函数的静态局部变量,以降低模块间的耦合度。

4)、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。

所谓"可重入"(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。

函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。

如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

相关文档
最新文档