C语言之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()。

C中的auto、static、register和extern的区别

C中的auto、static、register和extern的区别

} int A=13,B=-8;
也可以在多文件的程序中声明外部变量。
extern还可声明函数,eg:extern int fun(int a, int b);声明的外部函数可供其他文件调用,在C中,定义函数时省略extern,则隐含为外部函数 另附加一个两个关键字const和volitate
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
auto变量:函数中的局部变量,如不专门声明static,一般都是动态地分配存储空间。自动变量:在调用该函数时系统会给他们分配存储空间,一旦函数调用结束这些存储空间就会自动释放。关键字“auto”可以省略,不写则隐含确定为“自动存储类别”,属于动态存储方式。

C语言中static和auto用法详解

C语言中static和auto用法详解

C语⾔中static和auto⽤法详解⽬录static的第⼀种⽤法:定义为静态变量static的第⼆种⽤法:有理说不清,直接代码见真知auto的⽤法:直接代码见真知总结static的第⼀种⽤法:定义为静态变量何为静态变量?存储在静态数据区的变量会在程序刚开始运⾏时就完成初始化,也是唯⼀的⼀次初始化。

就是只进⾏⼀次初始化。

不理解?看代码!代码见真知:#include<stdio.h>int main(){void fun(); //定义⼀个空函数for(int i=0;i<3;i++){fun(); //调⽤函数}return 0;}void fun(){int i=0;static int static_i=0;printf("没有加static的结果为:%d\n",i);printf("加了static的结果为:%d\n",static_i);i++; //没有加static,i最终都会被初始化为0static_i++; //加了static,只初始化⼀次,后⾯继续累加printf("\n");}运⾏结果:由结果可以看出有static的在持续累加,除了第⼀次没有再初始化。

static的第⼆种⽤法:有理说不清,直接代码见真知#include<stdio.h>int main(){int i,sum;sum=2;for(i=0;i<3;i++){//外置模块printf("外置模块为:%d\n",sum);sum++;//内置模块{static int sum=1; //局部重新定义sum的初始值printf("内置模块为:%d\n",sum);sum++;}printf("\n");}return 0;}运⾏结果:由结果可见:外置模块和内置模块是互不影响的,这就是static的第⼆种⽤法,保持局部⼀部分稳定,不会随外部的变化⽽变化。

c语言中static变量详解

c语言中static变量详解

c语⾔中static变量详解Static翻译出来是“静态”“静⽌”的意思,在C语⾔中的意思其实和它的本意差不多,表⽰“静态”或者“全局”的意思,⽤来修饰变量和函数。

经static修饰过后的变量或者函数的作⽤域或者存储域会发⽣变化,⽽由static修饰的变量在初始值⽅⾯也会表现出static关键字的优势。

想知道经static修饰过后的变量或者函数的作⽤域或者存储域发⽣了什么变化吗,发⽣变化的原因是什么吗?请⼤家继续往下看!⼀、c程序的内存分布既然static是⽤来修饰变量和函数的,⽽变量和函数⼜是组成c程序必不可少的,C程序的内存分布图如下。

C程序由下⾯5部分组成: 1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。

3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储区。

是向⾼地址扩展的数据类型,是⾃下向上的扩展⽅式。

c程序内存分布图上⾯的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说⽩了就是与他们定义在程序的不同地⽅,有没有static关键字修饰有关啦,定义在不同的地⽅也说明了他们有着不同的作⽤域。

⼆、static修饰的变量1. 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在) 2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化) 3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。

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函数和普通函数的区别

c语言中static函数和普通函数的区别

c语⾔中static函数和普通函数的区别C程序⼀直由下列部分组成:1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令;2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。

3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储分。

在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在)2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化)3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。

准确地讲从定义之处开始到⽂件结尾。

好处:定义全局静态变量的好处:<1>不会被其他⽂件所访问,修改<2>其他⽂件中可以使⽤相同名字的变量,不会发⽣冲突。

局部静态变量在局部变量之前加上关键字static,局部变量就被定义成为⼀个局部静态变量。

1)内存中的位置:静态存储区2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化)3)作⽤域:作⽤域仍为局部作⽤域,当定义它的函数或者语句块结束的时候,作⽤域随之结束。

注:当static⽤来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。

但是局部静态变量在离开作⽤域之后,并没有被销毁,⽽是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进⾏访问。

当static⽤来修饰全局变量的时候,它就改变了全局变量的作⽤域(在声明他的⽂件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

static静态局部变量初始化问题

static静态局部变量初始化问题

static静态局部变量初始化问题第⼀次写博客之类的东西,主要是为了记录⾃⼰的学习过程,以便于记忆的加深和与各位⼤神进⾏探讨,学习更多的东西。

本次上传主要是关于静态局部变量的初始化问题。

⾸先,静态局部变量和全局变量⼀样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量的初始化节点⼜有点不太⼀样。

在C中,初始化发⽣在代码执⾏之前,编译阶段分配好内存之后,就会进⾏初始化,所以我们看到在C语⾔中⽆法使⽤变量对静态局部变量进⾏初始化,在程序运⾏结束,变量所处的全局内存会被全部回收。

⽽在C++中,初始化时在执⾏相关代码时才会进⾏初始化,主要是由于C++引⼊对象后,要进⾏初始化必须执⾏相应构造函数和析构函数,在构造函数或析构函数中经常会需要进⾏某些程序中需要进⾏的特定操作,并⾮简单地分配内存。

所以C++标准定为全局或静态对象是有⾸次⽤到时才会进⾏构造,并通过atexit()来管理。

在程序结束,按照构造顺序反⽅向进⾏逐个析构。

所以在C++中是可以使⽤变量对静态局部变量进⾏初始化的。

后⾯再来谈谈另⼀个问题,假如我们在⼀个循环中,定义了⼀个静态局部变量并进⾏初始化,循环过程中,编译器怎么知道当前的静态局部变量已经初始化过了呢?这个问题C和C++的处理⽅式也是不⼀样的。

C中编译器会直接跳过这⼀个语句,因为在编译的时候已经对静态局部变量进⾏过分配空间并初始化,所以代码执⾏过程中根本不需要再次执⾏。

⽽在C++中,编译器会在编译器分配内存后,在全局区域(当前静态局部变量的地址)附近同样分配⼀块空间,进⾏记录变量是否已经进⾏过初始化。

之所以说附近是根据编译器不同,处理⽅式不同导致的。

在⽹上有博客介绍某种编译器(该吧主并没有透露编译器名字),会在当前变量后⾯的⼀个字节进⾏改变,具体上代码:(Ps:若编译器已经发现当前变量初始化,则直接将整⾏代码跳过,若等式后⾯为n++,则不会继续执⾏++命令)从地址内存中我们可以看到在变量地址的后⾯⼀个字节中,有⼀个01⽤来记载当前静态变量是否初始化。

c语言中static函数的意义

c语言中static函数的意义

在C语言中,static关键字用于修饰函数或变量,表示它们的作用域仅限于当前源文件。

换句话说,它们是静态的,不会在其他源文件中被外部链接。

对于函数来说,如果一个函数被声明为static,那么它只在其所在的源文件中可见,不能在其他源文件中被调用。

这种限制有助于将函数的作用域限制在一定范围内,保护函数的代码和数据不被其他源文件干扰。

对于变量来说,如果一个变量被声明为static,那么它的生命周期被延长至程序的整个运行期间,而不仅仅是在其所在的函数执行期间。

这意味着,即使在函数调用结束后,该变量仍然存在,可以在下次函数调用时使用。

这种特性使得static变量常用于保存某些全局状态或跨多个函数间共享数据。

总的来说,static关键字在C语言中用于控制函数和变量的可见性和生命周期,有助于编写更加安全、可靠的代码。

c语言中变量的存储类别

c语言中变量的存储类别

一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。

二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。

所谓静态存储方式是指在程序运行期间有系统分配固定的存储空间的方式。

而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。

具体包含4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。

1. 自动的(auto)在调用函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。

2. 静态的(static)为了满足局部变量的值在函数调用结束后不消失而且保留原值,既占用的存储单元不释放,就出现了静态的局部变量,用static来声明的局部变量。

局部变量的特点:(1)相对自动变量(即动态局部变量),在程序的运行期间都占用静态存储区,直到程序结束才释放该存储区。

(2)静态局部变量只是在程序编译时赋初值,以后每次调用时不再重新赋初值,而只是保留上次函数调用结束时的值。

动态局部变量编译时不赋初值,直到程序调用时才给变量赋值,每次调用都要赋初值。

(3)在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0或空字符。

而对动态局部变量,不赋初值则它的值是一个不确定的值,因为动态变量每次都要自动分配存储空间,存储空间的值是不固定的。

(4)静态局部变量在函数调用结束后不释放,但其他函数是不能调用的。

3.寄存器的(register)为了提高程序的执行效率,对一些运算频繁的变量定义为寄存器变量可以节省每次程序执行时的内存读取,大大节省了时间,提高了效率。

寄存器的一些特点:(1)寄存器变量的特点程序运行时分配寄存器存储空间,结束时释放。

这个特点限定了只能把局部自动变量和形式参数定义为寄存器变量。

(2)局部静态变量不能定义为寄存器变量。

4. 外部的(extern)外部变量是在函数的外部定义的全局变量,他的作用是从变量的定义初开始,到本程序文件的末尾。

static在c语言中的作用

static在c语言中的作用

static在c语言中的作用
static在C语言中的作用主要有以下几点:。

1. 限定变量和函数的作用域: 加上static关键字后,变量和函数的作用域通常被限定在定义所在的文件内部,不能在其他文件中被访问和使用,这方便了程序的管理和维护。

2.防止冲突:在多文件程序中,如果多个文件中定义了同名的静态变量或函数,则它们之间不会产生冲突,这样可以避免命名空间的污染。

3.初始化:静态变量在程序运行时只会初始化一次,常常用于实现单例模式、缓存等功能。

4.存储位置:静态变量和函数通常存储在程序的数据段和代码段中,而不是栈内存中,因此它们的访问速度更快。

5.对象的持久性:静态变量在程序生命周期内一直存在,即使在函数调用结束后也不会被销毁,因此可以用于实现一些需要长期保存数据的功能。

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 可以用于函数内部的局部变量。

当一个变量被声明为 static 时,它的生命周期会延长到整个程序的执行期间,而不是仅在函数被调用时存在。

这意味着即使函数执行结束,该变量的值也会被保留,下次调用该函数时,该变量的值仍然有效。

其次,static 也可以用于全局变量。

当一个全局变量被声明为static 时,它的作用域会被限制在声明它的文件内,其他文件无法访问该变量。

这样可以避免在其他文件中意外修改该变量的值,增强了代码的安全性和可维护性。

另外,static 还可以用于函数的声明。

当一个函数被声明为static 时,它的作用域也会被限制在声明它的文件内,其他文件无法调用这个函数。

这样可以避免函数被其他文件意外调用,提高了代码的封装性和安全性。

总的来说,C 语言中的 static 关键字可以用于静态变量的声明,可以改变变量的生命周期和作用域,增强了代码的安全性和可维护性。

通过合理使用 static 关键字,可以更好地控制变量和函数的作用范围,提高程序的可靠性和可移植性。

C语言const和static

C语言const和static

C语⾔const和static
1. const 是constant 的缩写,“恒定不变”的意思。

被const 修饰的东西都受到强制保护,可以预防意外的变动,能提⾼程序的健壮性。

2. const可以修饰变量,函数的⼊参,函数的返回值
3. static第⼀个作⽤:隐藏. 当我们同时编译多个⽂件时,所有未加static前缀的全局变量和函数都具有全局可见性。

4. static的第⼆个作⽤是保持变量内容的持久。

存储在静态数据区的变量会在程序刚开始运⾏时就完成初始化,也是唯⼀的⼀次初始化。

5. static的第三个作⽤是默认初始化为0。

其实全局变量也具备这⼀属性,因为全局变量也存储在静态数据区。

在静态数据区,内存中所
有的字节默认值都是0x00,某些时候这⼀特点可以减少程序员的⼯作量。

c语言中static 变量

c语言中static 变量

c语言中static 变量1. static 变量静态变量的类型说明符是static。

静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。

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

2. 静态局部变量静态局部变量属于静态存储方式,它具有以下特点:(1)静态局部变量在函数内定义它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。

退出该函数后,尽管该变量还继续存在,但不能使用它。

(2)允许对构造类静态局部量赋初值例如数组,若未赋以初值,则由系统自动赋以0值。

(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。

而对自动变量不赋初值,则其值是不定的。

根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。

虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。

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

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

3.静态全局变量全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

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

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

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

而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

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

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

static静态变量的理解

static静态变量的理解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C语言static静态变量的作用

C语言static静态变量的作用

C 语⾔static 静态变量的作⽤C语⾔ static静态变量的作⽤staticc语⾔的变量种类1. 静态变量通过关键字 static 进⾏声明,该变量存储在数据段上,也就是内存上,可以改变变量的作⽤域和⽣命周期。

2. 对于局部变量作⽤域依旧没有改变,只有定义该局部变量的函数和复合语句可以引⽤,但是其⽣命周期变成了直到整个源程序⽂件结束。

3. 对于全局变量⽣命周期没有发⽣变化,但是其作⽤域反⽽有所减⼩,只有本⽂件的函数可以引⽤该全局变量。

4. 针对static的特性,只有本⽂件内的函数可以引⽤该变量,在C语⾔中⼀个源程序⽂件就是⼀个模块,⼀个源程序⽂件(模块)声明了⼀个static全局变量之后其他模块只能通过该模块提供的接⼝函数来访问这个static变量,⽽不能直接实现对其进⾏操作,也就是说static可以实现⼀个模块的封装。

范例:建⽴⼀个链表⽂件公司⼯资⽂件,tax.c:建⽴⼀个向外界提供⼀个接⼝函数声明,tax.h:如其他源⽂件user.c需要引⽤该⽂件,使⽤接⼝⽂件:1. #include <stdio.h>2.3. static int base = 10000; //基本的⼯资基数4.5. int chicken_legs (float i){6. return (1 + i)*base;7. }1. extern int chicken_legs (float i);1. #include <stdio.h>2. #include "tax.h"3.4. int main(void){5. int wage;6. float increase;7. wage = chicken_legs(increase);8. return0;9. }user.c这个⽂件就不能修改tax.c中的⽤static声明的 base,⽽只能引⽤接⼝函数,static 关键字使⽂件中的全局变量的范围局限于该⽂件中,从⽽起到⼀个封装⽂件的作⽤。

C语言之const与static用法

C语言之const与static用法
short l;//sizeof(l)==2 char *a = "abcddd";//sizeof(a)==4 void *s = malloc(100);//sizeof(s)==4 char b[] = "abcddd";//sizeof(b)==7*1 float c[20];//sizeof(c)==20*4; 例二: struct A
double a1;
long a; int a2;
char b;
};
#pragma pack()//sizeof(B)==17 说明:例二中演示了数据对其的情况,由于 CPU 访问数据的特点是一次访问多个字节,故如果多字节 数据的首地址是 2 的整数倍的话,将可以一次内存访问即可取得其所对应的所有数据,所以一个优化 要求就是变量的地址是其数据类型长度的整数倍,例如 int a 的 a 的地址要求是 4 的整数倍。 针对结构体,如果结构体中所有元素类型相同,作为数组处理,入 struct A;否则一般都是其最常 元素的整数倍,例如 struct B 和 C。这样处理的目的是考虑定义结构体数组的情况,例如 struct B b[10];那么这 10 个结构体变量如果每个长度都是 8,将能保证每个变量的第一个元素都能是 4 的整 数倍,否则将达不到这个效果,不能实现高效的内存访问,故编译器将对不符合要求的结构体自动调 整数据对齐。 最后需要交代的是,class 中的 static 变量不被分配到栈上,所以不能计入 sizeof 中,空类的长度 是 1,有虚函数的长度为 4,因为包含一个指向函数表的指针。 下面分析几个面试题: 例一:
void fstatic(void); static void fstatic(void) {

C语言中auto,static,register,extern存储类型的用法

C语言中auto,static,register,extern存储类型的用法

在C语言中提供的存储类型说明符有auto,extern,static,register,说明的四种存储类别。

四种存储类别说明符有两种存储期:自动存储期和静态存储期。

其中auto和register对应自动存储期。

具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。

Auto在函数内部定义的变量成为局部变量。

局部变量称为自动变量,这就与使用可选关键字a u t o定义局部变量这一作法保持一致。

局部变量仅由其被定义的模块内部的语句所访问。

换言之,局部变量在自己的代码模块之外是不可知的。

切记:模块以左花括号开始,以右花括号结束。

对于局部变量,要了解的最重要的东西是:它们仅存在于被定义的当前执行代码块中,即局部变量在进入模块时生成,在退出模块时消亡。

定义局部变量的最常见的代码块是函数。

请见以下代码:#include "stdio.h"main(){int i,num;num=2;for (i=0;i<3;i++){ printf("The num equal %d \n",num);num++;{auto int num=1;printf("The internal block num equal %d \n",num);num++;}}}运行的结果为:其实现在都不用打上auto了,编译器默认为auto的不信可以把auto删除试试。

StaticC语言中,存储类型static字面意思很容易把我们导入歧途,其实它的作用有三条,1,隐藏。

这也是最重要的一条。

2,static的第二个作用是保持变量内容的持久。

3,第三个作用是默认初始化为0。

(1)这里就先说第一条,当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

我举例来说明。

我们要同时编译两个源文件,一个是my.c,另一个是main.c。

c语言static用法

c语言static用法

c语言static用法C语言中的static关键字用法在C语言中,static是一个非常重要的关键字。

它可以应用于不同的上下文,具有不同的功能。

下面将逐一介绍几种常见的static用法。

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

与普通的局部变量不同,静态变量在程序运行期间只分配一次内存,即使函数执行结束后仍然保留其值。

静态变量存储在全局数据区,具有全局生存周期和局部作用域。

这使得静态变量在多次调用函数时能够保留之前的值。

2. 静态函数:使用static关键字声明的函数被称为静态函数。

静态函数只能在声明它的源文件中访问,无法被其他源文件调用。

静态函数的作用是限制函数的作用域,防止与其他文件中的同名函数冲突,也增加了代码的安全性。

3. 静态全局变量:在函数外部、全局作用域中使用static关键字声明的变量被称为静态全局变量。

与普通全局变量相比,静态全局变量只能在声明它的源文件中访问,其他源文件无法使用extern关键字引用它。

因此,静态全局变量的作用域仅限于当前源文件,避免了不必要的全局命名冲突。

4. 静态成员变量:在面向对象的程序设计中,使用static关键字声明的类成员变量被称为静态成员变量。

与普通的成员变量不同,静态成员变量属于整个类,而不是类的实例。

这意味着即使创建多个类的实例,静态成员变量的内存空间也只分配一次。

静态成员变量可以通过类名直接访问,无需通过对象来引用。

总结:通过以上介绍,我们可以看到static关键字在C语言中具有多种用法。

它可用于声明静态变量、静态函数、静态全局变量以及静态成员变量。

static的使用能够有效地控制变量和函数的作用域,增加程序的安全性和可读性。

熟练掌握static的用法对于写出高效、可靠的C语言程序非常重要。

C语言实用中什么是静态变量

C语言实用中什么是静态变量

c语言中什么是静态变量静态变量是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,下面是应届毕业生小编为大家整理的关于c语言中静态变量的介绍,希望可以帮到大家哦。

c语言静态变量的概念定义“静态变量”这一术语有两个容易混淆的定义:语言无关的通用定义:与程序有着相同生命周期(英语:Objectlifetime)的变量;C族语言特有的定义:以存储类声明的变量。

而在以Pascal为代表的许多程序语言中,所有局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取(对应“静态变量”),因此由于实际上“局部变量”和“全局变量”这两个术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。

一般来说,在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。

而今术语“静态变量”的概念则主要基于C族语言的“static”的定义(即定义2)。

c语言静态变量的常量使用静态变量也可以用于存储常数。

具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compiletime)设定,并且无法在运行时改变。

编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

c语言静态变量的变量特点静态局部变量静态局部变量属于静态存储方式,它具有以下特点:(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。

静态局部变量始终存在着,也就是说它的生存期为整个源程序。

(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
静态变量是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。
1. static 变量
静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
{
unsigned int index;
static unsigned int sum = 0; // 注意,是static类型的。
for (index = 1; index <= base; index++)
{
sum += index; Leabharlann return sum;
}
2 外部函数
外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
[extern] 函数类型 函数名(函数参数表)
{……}
调用外部函数时,需要对其进行说明:
[extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
static 函数类型 函数名(函数参数表)
{……}
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
2. 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。
3.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局 变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。
C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
D、静态全局变量过大,可那会导致堆栈溢出。
答案与分析:
对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。
对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。
对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。
因此,答案是A、B、C。
3、问题:不可重入函数
曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?
unsigned int sum_int( unsigned int base )
2、问题:Static的理解
关于static变量,请选择下面所有说法正确的内容:
A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
[案例]外部函数应用。
(1)文件mainf.c
main()
{ extern void input(…),process(…),output(…);
input(…); process(…); output(…);
}
(2)文件subf1.c
……
extern void input(……)
(3) 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的 值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
{……}
(3)文件subf2.c
……
extern void process(……)
{……}
(4)文件subf3.c
……
extern void output(……)
{……}
1、概述
static 声明的变量在C语言中有两方面的特征:
1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
4. static 函数…..
内部函数和外部函数
当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。
1 内部函数(又称静态函数)
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
答案与分析:
所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。
这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static
相关文档
最新文档