全局变量 与 static型的局部变量 有什么区别
发布网友
发布时间:2022-04-20 09:57
我来回答
共4个回答
热心网友
时间:2022-07-15 06:10
C语言全局变量和局部变量
引子---
? ?? ???变量可以在程序中三个地方说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为局部变量、形式参数和全程变量。从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的 可以有静态存储变量和动态存储变量之分。
一。全局变量和局部变量
1。局部变量
他是 指在函数内部定义的变量 作用域为定义局部变量的函数 也就是说他只能在定义他的函数中使用
最值得注意的是 只有在程序执行到定义他的模块时才能生成,一旦执行退出该模块则起变量消失
eg.
func ()
{
? ?int x;? ?局部变量x的作用域 很明确
? ?......
}
2。全局变量
在程序执行的过程中一直有效
eg.
int x=1;
func ()
{
? ?x=x+1;
}
func1 ()
{
??x=x-1;
}
main ()
{
}
由此不难看出整型x的作用范围
对于全局变量 如果在定义的时候不做初始化 则系统将自动为起赋值 数值型为0
字符型为空'\0'
全局变量的弊端 增加内存开销 降低函数的通用性
定义全局变量时 理想的位置是在文件的开头 当这些函数以及同一个程序中的其他源程序文件中的某些函数需要使用该全局变量时 在函数内部对该变量使用extern 加以说明 说明他是外部的
(这里还要做详细的讲解)
eg.
main ()
{
extern int a,b;
printf ("mIn is %d\n",min(a,b));
}
int a=1,b=2;
int min (x,y)
int x,y;
{
int z;
z=x<y?x:y;
return(z);
}
我还要说明的是 对外部变量的说明和对全局变量的定义不是一回事
对外部变量的说明 只是声明该变量是在外部定义过的一个全局变量 在这里引用 而对全局变量的定义则是要对起分配存储单元的
一个全局变量只能定义一次 可是却可以多次引用
*** 在同一源文件中,全局变量和局部变量同名时,在局部变量的作用域内,全局变量不起作用的。
二。静态存储变量和动态存储变量
对于程序运行期间根据需要进行临时动态分配存储空间的变量 为动态存储变量
对于那些程序运行期间永久占用固定内存的变量 称为静态存储变量
还要说明的是 程序的指令代码是存放在程序代码区的 静态存储变量是存放在静态数据区的 包括全局变量等 而程序中的动态存储变量存放在动态数据区 如函数的形参以及函数调用时的返回地址等
三。C语言中的变量存储分类指定
? ?
? ? auto
? ? auto称为自动变量 如果函数不做其他说明的话 均为自动变量
? ? static
? ? static称为静态变量。根据变量的类型可以分为静态局部变量和静态全程变量。
? ? 1. 静态局部变量
? ?
? ???它与局部变量的区别在于: 在函数退出时, 这个变量始终存在, 但不能被其它函数使用, 当再次进入该函数时, 将保存上次的结果。其它与局部变量一样。
? ?
? ? 2. 静态全程变量
? ?
? ???Turbo C2.0允许将大型程序分成若干独立模块文件分别编译, 然后将所有模块的目标文件连接在一起, 从而提高编译速度, 同时也便于软件的管理和维护。静态全程变量就是指只在定义它的源文件中可见而在其它源文件中不可见的变量。它与全程变量的区别是: 全程变量可以再说明为外部变量(extern), 被其它源文件使用, 而静态全程变量却不能再被说明为外部的, 即只能被所在的源文件使用。
? ?
? ?
? ? extern
? ? extern称为外部变量。为了使变量除了在定义它的源文件中可以使用外, 还要被其它文件使用。因此,? ?必须将全程变量通知每一个程序模块文件,? ?此时可用extern来说明。
eg.
? ?? ???文件1为file1.c? ?? ?? ?? ?? ?? ?文件2为file2.c
? ? int i, j;/*定义全程变量*/? ?? ???extern int i, j;/*说明将i, j从
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???文件1中复制过来*/
? ? char c;? ?? ?? ?? ?? ?? ?? ?? ???extern char c; /*将c复制过来*/
? ? void func1(int k);? ?? ?? ?? ?? ?func2()? ?? ???/*用户定义函数*/
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? {
? ? main()? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?static float k;/*定义静态变量*/
? ? {? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???i=j*5/100;
? ?? ?? ? func1(20);/*调用函数*/? ?? ???k=i/1.5;
? ?? ?? ? func2();? ?? ?? ?? ?? ?? ?? ?? ?? ?.
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? .
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? .
? ?? ?? ? .? ?? ?? ?? ?? ?? ?? ?? ?? ? }
? ???}
? ???func1(int k) /*用户定义函数*/
? ???{
? ?? ?? ? j=k*100;
? ???}
? ? 对于以上两个文件file1.c和file2.c, 用Turbo C2.0的集成开发环境进行编译
连接时, 首先应建立一个.prj的文件。例如file.prj, 该文件内容如下:
? ???file1.c
? ???file2.c
? ? 然后将file.prj的文件名写入主菜单Project中的Project Name项中。 再用F9
编译连接, 就可产生一个文件名为fioe.exe的可执行文件。
? ???
??
? ? register
? ? register称为寄存器变量。它只能用于整型和字符型变量。定义符register说明的变量被Turbo C2.0存储在CPU的寄存器中,??而不是象普通的变量那样存储在内存中, 这样可以提高运算速度。但是Turbo C2.0只允许同时定义两个寄存器变量,一旦超过两个, 编译程序会自动地将超过*数目的寄存器变量当作非寄存器变量来处理。因此, 寄存器变量常用在同一变量名频繁出现的地方。
? ? 另外, 寄存器变量只适用于局部变量和函数的形式参数, 它属于auto型变量,
因此, 不能用作全程变量。定义一个整型寄存器变量可写成:
? ?? ?register int a;
? ? 对于以上所介绍的变量类型和变量存储类型将会在以后的学习中, 通过例行程序中的定义、使用来逐渐加深理解。
热心网友
时间:2022-07-15 06:10
extern变量和static变量都是从静态存储区域分配内存,即他们的存储方式都一样
从静态存储区域分配内存的特点是,内存在程序编译时就已经分配好,这块内存在程序运行期间都存在,这也就导致了全局变量和static变量的生命期存在于整个程序运行中(即程序开始运行到程序结束)
static变量分为两种:
第一种:static局部变量
在函数体内定义int i;和static int i;的区别
首先他两都只在定义该变量的函数中有效
第一个属于非静态局部变量,他是从栈内存分配空间,其特点是从执行该函数开始,为i分配栈内存,函数结束运行后,i所分配的内存会被系统自动回收(即这个处理后的i值就此消失),所以他的生命期只存在于该函数运行中。并且,如果不对该变量初始化i指向一个任意值。
第二个属于静态局部变量,如果不对i初始化,系统自动初始化为0,函数结束运行后,i依然存在,即i的值不会消失(因为分配给他的内存没有被收回),比如:i被系统自动初始化为0,第一次调用该函数,i的初始值为0,执行函数中的语句后,i变为5,函数结束,第二次调用该函数时,此时i初始值为5,接着在执行其他语句,函数结束,以此类推。也就是说本次调用函数结束后的i值为下一次调用该函数i的初始值。
第二种:static全局变量
他与非静态全局变量的区别是:作用域不同
一个源程序由多个源文件组成,非静态的全局变量在各个源文件中都是有效的,而静态全局变量则*了其作用域, 即只在定义该变量的源文件内有效,在其他源文件下不能使用他。 其他的都一样。
以上主要让楼主了解关键字static的作用
热心网友
时间:2022-07-15 06:11
全局变量所有函数都可以使用,而static型的局部变量虽然寿命和全局变量相同,但是只能在函数的局部环境中使用。
热心网友
时间:2022-07-15 06:11
#include <stdio.h>
int gint1,gint2;//全局变量
int fun1()
{
static int n=0;//函数内部变量,由static修饰
n=n+10;
return n;
}
int fun2()
{
int n=0;//函数内部变量
n=n+10;
return n;
}
void main()
{
gint1=12;//初始化为12
gint2=12;
gint1=fun1();//执行一次
gint2=fun2();
printf("第一次:gint1=%d,gint2=%d\n",gint1,gint2);
gint1=fun1();//执行二次
gint2=fun2();
printf("第二次:gint1=%d,gint2=%d\n",gint1,gint2);
}
输出
第一次:gint1=10,gint2=10
第二次:gint1=20,gint2=10
在函数定义变量,如果用static修饰时,函数每次执行,该变量不是按最开始初始化,而是保留上次数值的
全局变量是一直贯穿整个程序的,直到程序运行完才被关闭
而局部变量当函数结束后,static修饰的变量继续保留,只不过在函数其他地方不能引用的。