幽逸软件

您现在的位置是:首页 > 电脑故障 > 正文

电脑故障

全局变量与局部变量

最近更新2023-11-07电脑故障676
全局变量与局部变量

1、 全局变量的作用用这个程序块,而局部变量作用于当前函数

2、前者在内存中分配在全局数据区,后者分配在栈区

3、 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在歼御

4、 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用

操作系统和编译器通过内存分配的氏早岩位置来知道的全局变量分配在全局数据段,并且在程序被运行的时候就被加载。

编译器通过语法词法的分析,判断出是全局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址 (windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的操作时是睁配对一个硬编码的地址操做。

局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。 以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。

操作系统通过变量的分配地址就可以判断出是局部变量和全局变量。

1、 全局变量的作用用这个程序块,而局部变量作用于当前函数;

2、前者在内存中分配在全局数据区,后者分配在栈区;

3、 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;

操作系统和编译器通过内存分配的位置来知道的全局变量分配在全局数据段,并且在程序被运行的时候就被加载。;

编译器通过语法词法的分析,判断出是全悉仔局变量还是局部变量。如果是全局变量的话,编译器在将源代码翻译成二进制代码时就为全局变量分配好一个虚拟地址 (windows下0x00400000以上的地址,也就是所说的全局区),所以程序在对全局变量的操作时是对一个硬编码的地址备陆晌操做。

局部变量的话,编译时不分配空间,而是以相对于ebp或esp的偏移仿锋来表示局部变量的地址,所以局部变量内存是在局部变量所在的函数被调用时才真正分配。 以汇编的角度来看:函数执行时,局部变量在栈中分配,函数调用完毕释放局部变量对应的内存,另外局部变量可以直接分配在寄存器中。

局部变量和全局变量的区别有:定义范围不同,作用域不同、生命期不同。

主要表现在:

1、定义范围不同,一个是函数体内部,一个是函晌纯数外部。

2、作用域不同,一个仅限于函数体内容,一个是整个程序。

3、生命期不同,全局变量的生命期和主程序一样,随程序的销毁棚码而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了。

全局变量:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。

局部变量宴和咐:定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。

我认为只要是extern定义的变量都是全局睁察仿变量,还有只要是在main函数外的就是全局变量,不加extern的在main函数里面得就是局部变量!

全局变量是指在整个程序中都可用,而局部变量只是在定义他的那个{}里可用!出了那个{}他就没意义了!

你这个程序是函数的参数调用!程序的意思是:定义了两个全局没敏变量(个人认为这里定义成局部变量也没什么)并比较这两个变量中最大的值。这里是调悉纤用了一个用户自定义函数来比较的!

a=1 b=2是全局变量,这点没错

因为在main函数中,调用了fun2();,在函数fun2中,把全局变量赋与了新值谈歼,a=4和b=9,那含搭冲么全局变量ab就变为了这个新的数值,在输出的时候就输出它们的新值。

全局变量的含义枝老简单来说就是全部函数可以使用它或全局可以使用,而不是你理解的它的数值是不可改变的。除非你用const来修饰这个变量,即全局变量const int a=1;,这个a就是不可变的,如果在函数中改变a的值,编译都不能通过。

理解了吗。