C语言中的static 详细分析

合集下载

c++的static关键字用法

c++的static关键字用法

c++的static关键字用法C++中的`static`关键字有多种用法,在不同的场景下都有着不同的含义和作用。

本文将详细介绍C++中`static`关键字的用法及其相关特性,希望能对读者更好地理解和运用这个关键字。

一、`static`关键字概述`static`是C++中的一个关键字,它常用于指定函数、变量、类成员等的作用域和生命周期。

它的主要作用如下:1. 限定变量的作用域。

使用`static`关键字声明的变量具有静态的生存期和块作用域,即在整个程序运行期间都存在,并且只能在声明变量的源文件中访问。

2. 限定函数的作用域。

使用`static`关键字声明的函数具有静态的作用域,即只能在声明它的源文件中调用。

3. 限定类成员的作用域。

使用`static`关键字声明的类成员为静态成员,它不属于类的任何一个对象,而是属于整个类,可以通过类名或类对象来访问。

4. 防止符号重定义。

当在多个源文件中定义同名的全局变量或函数时,使用`static`关键字可以防止它们之间的符号重定义错误。

二、静态变量1. 全局静态变量使用`static`关键字声明的全局变量具有静态生存期和文件作用域,即它在程序运行期间一直存在,而且只能在声明它的源文件中访问。

例如:```cpp//file1.cpp#include <iostream>static int count = 10; //声明全局静态变量countvoid func() {static int i = 5; //局部静态变量i,生命周期为整个程序运行期间std::cout << "i is " << i ;std::cout << " and count is " << count << std::endl;i++;count++;}```在另一个源文件中引用这个全局静态变量,编译器会报错:```cpp//file2.cpp#include <iostream>extern int count; //声明全局变量countvoid func2() {std::cout << "count is " << count << std::endl;}```编译器会报错:undefined reference to `count'。

c++语言static constexpr const的作用和用法

c++语言static constexpr const的作用和用法

c++语言static constexpr const的作用和用法在C语言中,static、constexpr和const这三个关键字都具有特殊的含义,它们在编译时期就有特殊的作用。

首先,我们来看一下static关键字。

在C语言中,static关键字具有多种含义,但在这种情况下,我们主要关注其存储分类的意义。

在C语言中,变量可以根据其存储位置分为三种类型:自动存储分类(automatic storage duration)、静态存储分类(static storage duration)和外部存储分类(external storageduration)。

其中,static关键字修饰的变量具有静态存储分类,它们在程序执行期间只分配一次,其值在整个程序执行期间保持不变。

接下来,我们来看一下constexpr关键字。

在C++11及其后续版本中,constexpr是一个关键字,它用于指示一个变量或函数可以在编译时期进行求值。

当constexpr被应用于一个变量或函数时,编译器会尝试在编译时期就计算出结果,而不是等到运行时期。

这对于编译时就能确定结果的情况非常有用,因为它可以大大提高编译的效率。

最后,我们来看一下const关键字。

在C语言中,const关键字用于声明一个变量的只读性。

当一个变量被声明为const时,它的值就不能被改变。

这对于确保程序的稳定性和防止意外的数据更改非常有用。

这三个关键字在C语言中的组合使用可以产生一些有趣的效果。

例如,我们可以使用static const constexpr来创建一个常量。

这样的常量在编译时期就能求值,并且具有静态存储分类,这意味着它们在整个程序执行期间都保持不变。

这样的常量通常用于定义程序的固定值,例如常数和标志。

另外,我们还可以使用constexpr来创建更高效的常量。

例如,如果我们有一个数组的大小是在编译时期就能确定的话,我们就可以使用constexpr来声明这个数组。

c语言static 数组的赋值

c语言static 数组的赋值

C语言中的static关键字和数组是编程中常用的概念,而将它们结合起来进行赋值操作更是程序员经常会遇到的需求。

本文将从静态数组的定义和使用、静态关键字的作用、以及静态数组的赋值方式等方面进行分析和总结,希望能够为读者提供一些有益的知识。

一、静态数组的定义和使用静态数组是C语言中的一种数据类型,它是由相同类型的元素组成的集合。

静态数组在定义时需要指定数组的大小,例如:```cint arr[5];```上述代码定义了一个包含5个整型元素的静态数组。

静态数组的大小在定义时就已经确定,不能够在程序运行过程中进行动态调整。

静态数组的元素通过索引来进行访问,索引从0开始,例如:```cint value = arr[2];```上述代码就是访问arr数组中第3个元素的值,并将其赋给value变量。

二、静态关键字的作用在C语言中,static关键字有两个不同的作用,一个是用于修饰变量,另一个是用于修饰函数。

在这里我们主要讨论static修饰静态数组时的作用。

当static修饰一个全局数组时,它表示该数组在整个程序运行过程中只有一份内存空间,即使在不同的文件中引用该数组,也都指向同一块内存空间。

这意味着该数组的值在多处都是共享的,这在一些特定的场景下可能会带来一些问题。

而static修饰一个局部数组时,则表示该数组在程序执行时只会初始化一次,即使函数多次被调用,该数组的值也会保持不变。

三、静态数组的赋值方式在C语言中,静态数组的赋值有多种方式,下面将分别介绍这些方式及其使用场景。

1. 手动逐个赋值手动逐个赋值是最基本的数组赋值方式,即通过循环遍历数组,并逐个赋值。

例如:```cint arr[5];for (int i = 0; i < 5; i++) {arr[i] = i;}```这种方式的优点是灵活,适用于任何数组元素需要单独计算的场景。

但缺点是效率较低,尤其是对于较大的数组来说,循环遍历的开销较大。

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,实现了清零的效果。

c语言中static int的作用和用法

c语言中static int的作用和用法

c语言中static int的作用和用法摘要:1.static 关键字的作用2.static int 的用法3.static int 的作用4.举例说明static int 的应用正文:一、static 关键字的作用在C 语言中,static 关键字可以用来修饰变量和函数,它的作用主要体现在以下几个方面:1.限定作用域:当static 关键字用于修饰变量时,它可以限制变量的作用域,使变量只能在定义它的源文件内被访问,不能在其他源文件中被访问。

这有助于降低程序的耦合度,提高程序的模块化程度。

2.静态存储:当static 关键字用于修饰变量时,它会指示编译器将该变量存储在全局数据区或栈中,而不是存储在堆中。

这样可以使变量的生命周期与程序的生命周期相同,而不是仅在函数调用期间存在。

二、static int 的用法static int 可以用来声明静态整型变量。

静态整型变量的生命周期与程序的生命周期相同,即在整个程序运行期间都不会被重新初始化。

在函数内部定义static int 变量时,该变量只会在第一次调用函数时被初始化,之后的函数调用不会再次初始化该变量。

三、static int 的作用static int 的作用主要体现在以下几点:1.保存变量的状态:由于static int 变量的生命周期与程序的生命周期相同,因此可以用来保存程序运行过程中的一些状态信息,例如计数器、标志位等。

2.限制变量的作用域:通过在函数内部定义static int 变量,可以限制该变量的作用域,使其仅在函数内部有效,从而降低程序的耦合度。

3.提高程序的模块化程度:通过使用static 关键字,可以将程序划分为多个模块,每个模块负责处理特定的功能,有助于提高程序的模块化程度,便于程序的维护和升级。

四、举例说明static int 的应用下面是一个使用static int 的示例:```c#include <stdio.h>// 定义一个静态整型变量,用于记录函数的调用次数static int count = 0;// 计算阶乘的函数int factorial(int n) {// 检查n 是否为0,如果是,则返回1if (n == 0) {return 1;}// 计算n 的阶乘int result = 1;for (int i = 1; i <= n; i++) {result *= i;}// 增加调用次数count++;return result;}int main() {// 调用factorial 函数,计算4 的阶乘int result = factorial(4);printf("4 的阶乘是:%d", result);// 输出函数的调用次数printf("factorial 函数已调用%d次", count);return 0;}```在这个示例中,我们定义了一个静态整型变量count,用于记录factorial 函数的调用次数。

C# static关键字的作用

C# static关键字的作用

C#: static关键字的作用static意思是静态,可以修饰类、字段、属性、方法标记为static的就不用创建实例对象调用了,可以通过类名直接点出来static三种用法:1.用于变量前,表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为静态函数:private void s(){staticint a=1;a++;}方法第一次调用结束后a在内存内值为2;方法第一次调用结束后a在内存内值为3;2.在方法(函数)前用static修饰,表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有,这个方法称为静态方法:情况一:非静态方法:class t{t(....(参数,下面同)){~~~~(方法内容,下面同)}void s(....){~~~~}}当你在其他方法里调用这个类中的方法s,则需先声明这个类的变量如:tsd = new t(....);再在t里调用方法:sd.s(....);情况2:静态方法:class t{t(....(参数,下面同)){~~~~(方法内容,下面同)}static void s(....){~~~~}}当你在其他方法里调用这个类中的方法s,则不用先声明这个类的变量如直接调用方法:t.s(....);3.用于class前,说明此类型无法新建实例,简单点说这个类型的方法全是静态方法,这个类里的非静态方法是不能使用的,这个类型称为静态类.比如C#控制台操作的Cancle类里面的成员就被标记为静态的,可以直接用Concle.直接点出来使用。

如果没有标记为静态就要通过创建实例对象来调用,比如说动态字符串StringBuilder就要new一个实例来调用StringBuildersb =new StringBuilder();sb.xxx(); //xxx是方法名static class t{~~~~}~~~~class d{~~~~void f(....){~~~~t v = new t();//此时程序会出现错误}}。

c语言static 的三个作用

c语言static 的三个作用

c语言static 的三个作用static是C语言中的关键字,常用于定义变量和函数。

它有三个主要的作用:作用域限定、生命周期延长和隐藏实现。

一、作用域限定:1.1局部变量的作用域限定:在函数内部使用static修饰的局部变量,使其只能在定义它的函数内部使用,不能被其他函数访问。

这样可以避免在不同函数中使用相同名称的变量造成的冲突。

1.2函数的作用域限定:在函数外部使用static修饰的函数,使其只能在本文件内部使用,不能被其他文件调用。

这主要用于隐藏一些辅助性的函数,提高程序的安全性和模块化程度。

二、生命周期延长:2.1局部变量的生命周期延长:使用static修饰的局部变量,在程序运行时一直存在,不会随着函数执行结束而销毁,直到程序结束才会被销毁。

这样可以在多次调用函数时保持变量的值不变,起到记忆的作用。

2.2全局变量的生命周期延长:使用static修饰的全局变量,生命周期同样延长到整个程序运行期间。

这样可以在不同的函数中共享同一个全局变量,达到数据共享的目的。

三、隐藏实现:使用static修饰的变量和函数,其作用域被限定在本文件内部,其他文件无法直接使用和访问,从而隐藏了其具体的实现细节。

这样可以提高程序的安全性和可维护性,使得代码更加模块化。

下面进一步解释每个作用:1.作用域限定:1.1局部变量的作用域限定在函数内部使用static修饰局部变量,该变量只能在定义它的函数内部使用,无法在其他函数中使用。

这种限制避免了在不同的函数中多次声明相同名称的变量带来的冲突。

同时,static修饰的局部变量在函数执行完毕后并不销毁,而是保留其值,下次再次调用该函数时,仍能使用先前存储的值。

比如:```cvoid func() {static int count = 0;count++;printf("%d\n", count);}```在上面的例子中,count是一个静态局部变量,每次调用func函数时,count的值会自增并输出。

c语言 static 函数

c语言 static 函数

c语言 static 函数C语言中的static函数static函数是一种用来在C语言中定义局部函数的特殊函数,它的作用是提供一种方法来实现函数的封装,使其变得不可见,只能在本文件或模块中使用。

它一般是由程序员自己定义的,而不是编译器自动产生的,它可以用来提高程序的可维护性和可靠性,节省内存空间。

static函数同样也是一种普通函数,它同样也有返回值,参数和函数体,但它的存储类别位static,主要有如下两点特点:1、定义的static函数只能在当前模块或文件中使用,不允许外部访问;2、static函数对外不可见,就像它被隐藏了一样,编译的时候它不会生成对外的调用入口,即该函数不能被其它函数调用。

static函数也称为私有函数,因为它只能在它所在的文件或模块中访问,其他外部文件中无法访问,这样就相当于一种封装,只有本文件中的函数才能调用static函数,这样可以让该函数仅仅被本文件内部使用。

static函数通常被用在一个文件的多个函数之间建立交互,但是不让外界访问的情况下,它的优点是可以保护程序的设计细节,而且可以提高程序的运行效率,因为编译器不会为它产生函数调用开销。

写一个例子:#include<stdio.h>int mul();int add(){int a = 10;int b = 20;int result = a+b;return result;}int mul(){int result = static_add(); result = result * 10;return result;}static int static_add(){int a = 5;int b = 10;int result = a+b;return result;}{int result = add();printf('add result = %d', result);int mul_result = mul();printf('mul result = %d', mul_result);return 0;}以上就是关于C语言中的static函数的介绍,它可以让函数保护起来不被外界访问,同时也不会产生调用开销,使程序变得更加可靠可维护,尤其是在复杂大型程序中,更是非常不可或缺。

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

C语言中的static 详细分析-----发现讲的很好所以转帖google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大。

所以,我这篇博文博采众家之长,把互联网上的资料整合归类,并亲手编写程序验证之。

C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。

伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。

下面,详细分析一下static关键字在编写程序时有的三大类用法:一,static全局变量我们知道,一个进程在内存中的布局如图1所示:其中.text段保存进程所执行的程序二进制文件,.data段保存进程所有的已初始化的全局变量,.bss段保存进程未初始化的全局变量(其他段中还有很多乱七八糟的段,暂且不表)。

在进程的整个生命周期中,.data段和.bss段内的数据时跟整个进程同生共死的,也就是在进程结束之后这些数据才会寿终就寝。

当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。

静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。

所以,普通全局变量穿上static外衣后,它就变成了新娘,已心有所属,只能被定义它的源文件(新郎)中的变量或函数访问。

以下是一些示例程序file1.h如下:1.#include <stdio.h>2.3.void printStr();我们在file1.c中定义一个静态全局变量hello, 供file1.c中的函数printStr访问.1.#include "file1.h"2.3.static char* hello = "hello cobing!";4.5.void printStr()6.{7.printf("%s\n", hello);8.}file2.c是我们的主程序所在文件,file2.c中如果引用hello会编译出错1.#include "file1.h"2.3.int main()4.{5.printStr();6.printf("%s\n", hello);7.return 0;8.}9.报错如下:10.[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2file2.c: In functi on …main‟:file2.c:6: 错误:…hello‟ 未声明(在此函数内第一次使用)file2.c:6: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其file2.c:6: 错误:所在的函数内只报告一次。

)如果我们将file2.c改为下面的形式:1.#include "file1.h"2.3.int main()4.{5.printStr();6.return 0;7.}8.则会顺利编译连接。

9.运行程序后的结果如下:[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2[liujx@server235 static]$ ./file2hello cobing!上面的例子中,file1.c中的hello就是一个静态全局变量,它可以被同一文件中的printStr 调用,但是不能被不同源文件中的file2.c调用。

二,static局部变量普通的局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。

局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

static局部变量中文名叫静态局部变量。

它与普通的局部变量比起来有如下几个区别:1)位置:静态局部变量被编译器放在全局存储区.data(注意:不在.bss段内,原因见3)),所以它虽然是局部的,但是在程序的整个生命周期中存在。

2)访问权限:静态局部变量只能被其作用域内的变量或函数访问。

也就是说虽然它会在程序的整个生命周期中存在,由于它是static的,它不能被其他的函数和源文件访问。

3)值:静态局部变量如果没有被用户初始化,则会被编译器自动赋值为0,以后每次调用静态局部变量的时候都用上次调用后的值。

这个比较好理解,每次函数调用静态局部变量的时候都修改它然后离开,下次读的时候从全局存储区读出的静态局部变量就是上次修改后的值。

以下是一些示例程序:file1.h的内容和上例中的相同,file1.c的内容如下:1.#include "file1.h"2.3.void printStr()4.{5.int normal = 0;6.static int stat = 0; //this is a static local var7.printf("normal = %d ---- stat = %d\n",normal, stat);8.normal++;9.stat++;10.}为了便于比较,我定义了两个变量:普通局部变量normal和静态局部变量stat,它们都被赋予初值0;file2.c中调用file1.h:1.#include "file1.h"2.3.int main()4.{5. printStr();6. printStr();7. printStr();8. printStr();9. printf("call stat in main: %d\n",stat);10. return 0;11.}12.这个调用会报错,因为file2.c中引用了file1.c中的静态局部变量stat,如下:13.[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2file2.c: In function …main‟:file2.c:9: 错误:…stat‟ 未声明(在此函数内第一次使用)file2.c:9: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其file2.c:9: 错误:所在的函数内只报告一次。

)14.编译器说stat未声明,这是因为它看不到file1.c中的stat,下面注掉这一行:15.#include "file1.h"16.17.int main()18.{19.printStr();20.printStr();21.printStr();22.printStr();23. //printf("call stat in main: %d\n",stat);24.return 0;25.}liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2[liujx@server235 static]$ ./file2normal = 0 ---- stat = 0normal = 0 ---- stat = 1normal = 0 ---- stat = 2normal = 0 ---- stat = 3运行如上所示。

可以看出,函数每次被调用,普通局部变量都是重新分配,而静态局部变量保持上次调用的值不变。

需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。

这在多线程编程时可能会成为一种隐患。

需要多加注意。

三,static函数相信大家还记得C++面向对象编程中的private函数,私有函数只有该类的成员变量或成员函数可以访问。

在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

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

所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。

下面是一些示例:file1.h如下:1.#include <stdio.h>2.3.static int called();4.void printStr();file1.c如下:1.#include "file1.h"2.3.static int called()4.{5.return 6;6.}7.void printStr()8.{9.int returnVal;10.returnVal = called();11.printf("returnVal=%d\n",returnVal);12.}file2.c中调用file1.h中声明的两个函数,此处我们故意调用called():1.#include "file1.h"2.3.int main()4.{5.int val;6.val = called();7.printStr();8.return 0;9.}10.liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2file1.h:3: 警告:…called‟ 使用过但从未定义/tmp/ccyLuBZU.o: In function `main':file2.c.text+0x12): undefined reference to `called'collect2: ld 返回1因为引用了file1.h中的static函数,所以file2.c中提示找不到这个函数:undefined reference to 'called'11.下面修改file2.c:12.#include "file1.h"13.int main()14.{15.printStr();16.return 0;17.}编译运行:[liujx@server235 static]$ gcc -Wall file2.c file1.c -o file2[liujx@server235 static]$ ./file2returnVal=6static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。

相关文档
最新文档