关于c语言auto变量和static变量区别

关于c语言auto变量和static变量区别

本文目录

  • 关于c语言auto变量和static变量区别
  • C语言中static修饰变量
  • static全局变量与普通的全局变量区别是
  • static变量存储在哪里
  • 什么是静态变量
  • Static是什么意思啊,在C程序里面
  • 静态变量与非静态变量的区别
  • static变量有什么作用
  • static变量可以被修改吗
  • static变量特点

关于c语言auto变量和static变量区别


一、主体不同

1、auto变量:是一个C/C++语言存储类型,仅在语句块内部使用。

2、static变量:在计算机编程领域指在程序执行前系统就为之静态分配存储空间的一类变量。

二、作用域范围不同

1、auto变量:初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式。

2、static变量:针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域。

三、特点不同

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

2、static变量:在函数内以static声明的变量虽然与自动局部变量的作用域相同,但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同。

参考资料来源:百度百科-静态变量

参考资料来源:百度百科-auto


C语言中static修饰变量


可以,static在C语言中是表示一个变量为静态变量的,而不是常量,也不是不可变的变量。所谓的静态变量有两种情况,一种是静态全局变量,一种是静态局部变量。
先说静态局部变量:通常情况下,在一个函数中定义一个变量,那么函数退出之后,这个变量就消失了,即使你第二次调用这个函数,里面的变量也会被重新赋初值。比如我们写一个函数:
int fun(int a)
{int sum;
sum=sum+a;
return sum;}
这样无论你是第几次调用fun这个函数,sum都会重新被赋初值,也就是函数的返回值一直会是a;而不会出现多次调用累加的情况。
但如果你在一个函数中,用static来声明变量,那么这个变量虽然在函数外部不可用,但退出函数时,这个变量是不会消失的,下一次再调用这个函数,里面的值仍然存在。就说上面这个函数,如果你的第一句写成static int sum;那么你第一次调用fun(3);函数返回3,第二次再调用fun(5);函数返回值是8,因为第一次调用之后的sum=3的值不会消失。

另一种是静态全局变量。因为是全局变量,不存在退出函数消不消失的问题。所以静态全局变量和普通全局变量的区别是:普通全局变量在其他源文件中可以通过extern全局变量名的声明,来使用该变量,而静态全局变量只能在变量所在的文件中使用,即使你在其他文件中使用extern声明也不可以使用,这样可以有效避免不同文件全局变量的冲突。
希望能解决您的问题。

static全局变量与普通的全局变量区别是


static全局变量只初使化一次,防止在其他文件单元中被引用;全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。

static变量存储在哪里


该变量在全局数据区分配内存;
未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的; 
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的
代码区,全局数据区,堆区,栈区
一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将
static int n; //定义静态全局变量
改为
int n; //定义全局变量
程序照样正常运行。
的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:
静态全局变量不能被其它文件所用;
其它文件中可以定义相同名字的变量,不会发生冲突;

什么是静态变量


静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在
静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直
到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执
行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

Static是什么意思啊,在C程序里面


static可应用于应用于内部变量、外部变量和函数。应用于内部变量时,其作用是用来指定变量的存储类别为静态变量。应用于外部变量和函数时,其作用是限制变量或函数的作用范围仅限于外部变量或函数所在的源文件。

1、在整个程序运行的过程中,无论静态内部变量所在的函数被调用了多少次,静态内部变量只运行一次初始化,即在程序运行时完成的。

2、在函数的两次调用期间,静态内部变量所在存储单元不被释放,因而当前次函数调用执行时其值会被保存下来,下次调用时该值依然存在。即静态内部变量的值在从一次函数调用到下一次函数调用到下一次函数调用到下一次函数调用之间保持不变。

3、 默认情况下,外部变量的作用域是从定义变量的位置到所在源文件的末尾。

一、函数分为内部函数和外部函数

当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

1、内部函数(又称静态函数)

如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。

定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:

static 函数类型 函数名(函数参数表){……}

关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

2、外部函数

外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:

[extern] 函数类型 函数名(函数参数表){……}

调用外部函数时,需要对其进行说明:

[extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];

二、C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

扩展资料:

static的作用

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

1、最重要的一条:隐藏。

同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

2、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

3、static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。

如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。

最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

参考资料来源:

百度百科-static函数

百度百科-c语言


静态变量与非静态变量的区别


1、存储位置不同

静态变量:存储在全局数据区(静态数据区)。

非静态变量叫动态变量:存储在内存出栈数据区。

2、生命期不同

动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效。

静态变量:程序结束时才释放。

3、作用域不同

动态变量:同样的要根据你定义的位置才能确定,和第二点的一样。

静态变量:当前文件中有效。

扩展资料;

静态变量的作用;

1、对于静态全局变量,源文件静态声明的文件级变量和函数的作用域仅限于文件(仅在文件中可见),即内部连接,因此可以用来限制变量的作用域。

2、对于静态局部变量,虽然函数内静态声明的变量范围与自动局部变量的范围相同(即范围仅在函数内),但存储空间是通过静态分配而不是默认的自动分配获得的。

所以存储空间在不同的区域是不同的(一般来说,静态分配时在编译时在程序数据段中划分存储空间,一次性分配在整个过程中是有效的。而在自动分配时,存储空间是在调用堆栈上分配的,只分配和释放在调用期间),两个调用之间的变量值总是一致的。必须注意,静态局部变量只能初始化一次,这是由编译器保证的。

3、对于静态成员变量,在C++中,类定义中静态声明的成员变量属于类变量,即它们在所有类实例中共享,相反是过程变量。

参考资料来源;百度百科——静态变量

百度百科——动态变量


static变量有什么作用


C语言中的static变量,可称为静态本地变量。一般来说,一个函数内部定义的变量的作用域和生存周期只限于这个函数。但是如果加了static在它前面,他的生存周期就会变大。也就是说离开这个函数后,这个静态变量不会被回收,会一直存在,保持着上一次的值,这点性质类似于全局变量。但是与全局变量不同的是,静态本地变量的作用域还是仅限于该函数内。希望能够对你有所帮助!

static变量可以被修改吗


静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

static变量特点


二、static修饰的变量
1. 全局静态变量
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是 任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
定义全局静态变量的好处:
《1》不会被其他文件所访问,修改
《2》其他文件中可以使用相同名字的变量,不会发生冲突。
2. 局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
1)内存中的位置:静态存储区
2)初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

推荐阅读