c++局部变量详解

合集下载

局部变量和全局变量

局部变量和全局变量

{ int c;
c=a>b?a:b;
//把a和b中的大者
存放在c中
return (c);
局部变量a的作用范围 全局变量b的作用范围
形参a,b的作用范围
运行结果: max=8
程序分析:在此例中,故意重复使用a和b3变量名,请 读者区别不同的a和b的含义和作用范围。程序第二行定义了 全局变量a和b,并使之初始化。第三行是main函数,在 main函数中(第六行)定义了一个局部变量a。局部变量a 的作用范围为第6-8行。在此范围内全局变量a 被局部变量a 屏蔽,相当于全局变量a在此范围内不存在(即它不起作 用),而全局变量b在此范围内有效。因此第六行max(a, b)的实参a应是局部变量a,所以max(a,b)相当于max (8,5)。它的值为8。
全局变量
在函数内定义的变量是局部变量,而在函数之外定义的变量为外部 变量,外部变量是全局变量(也称全程变量)。全局变量可以为本 文件中其他函数所共用。它的有效范围 为从定义变量的位置开始到 本源文件结束。 注意:在函数内定义的变量是局部变量,在函数外定义的变量是全局 变量。
分析下面的程序段: int p=1,q=5; float f1(int a) {
为了便于区别全局变量和局部变量,在C程序设计人员中有一个习惯 (但非规定),将全局变量名的第一个字母用大写表示。
例7.14 有一个一维数组,内放10个学生成绩,写一个函数,当主函数 调用此函数后,能求出平均分,最高分和最低分。
解题思路:调用一个函数可以得到函数的返回值,现在希望通过函数 调用能得到3个结果。可以利用全局变量来达到此目的。
(4) 在一个函数内部,可以在复合语句中定义变量,这些变量只 在本复合语句中有效,这种复合语句也称为“分程序”或“程 序块”。

c语言全局变量和局部变量问题及解决汇总

c语言全局变量和局部变量问题及解决汇总

c语⾔全局变量和局部变量问题及解决汇总答:能,局部会屏蔽全局。

要⽤全局变量,需要使⽤"::"局部变量可以与全局变量同名,在函数内引⽤这个变量时,会⽤到同名的局部变量,⽽不会⽤到全局变量。

对于有些编译器⽽⾔,在同⼀个函数内可以定义多个同名的局部变量,⽐如在两个循环体内都定义⼀个同名的局部变量,⽽那个局部变量的作⽤域就在那个循环体内。

答:extern可以⽤引⽤头⽂件的⽅式,也可以⽤extern关键字,如果⽤引⽤头⽂件⽅式来引⽤某个在头⽂件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你⽤extern⽅式引⽤时,假定你犯了同样的错误,那么在编译期间不会报错,⽽在连接期间报错。

答:可以,在不同的C⽂件中以static形式来声明同名全局变量。

可以在不同的C⽂件中声明同名的全局变量,前提是其中只能有⼀个C⽂件中对此变量赋初值,此时连接不会出错static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。

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

这两者在存储⽅式上并⽆不同。

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

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

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

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

把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。

static函数与普通函数作⽤域不同,仅在本⽂件。

只在当前源⽂件中使⽤的函数应该说明为内部函数(static),内部函数应该在当前源⽂件中说明和定义。

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量在C语言中,局部变量和全局变量是两种不同的变量类型,它们分别用于特定的程序设计需求。

本文将介绍局部变量和全局变量的定义、作用域以及在使用中的注意事项。

一、局部变量的定义和作用域局部变量是在函数内部声明的变量,它们只能在其所在的函数内部使用。

当函数被调用时,局部变量会在内存中被分配空间,当函数执行完毕后,局部变量所占用的内存会被释放。

局部变量的定义方式为在函数内部声明变量的语句前加上数据类型。

局部变量的作用域仅限于所在的函数内部。

这意味着其他函数无法直接访问同一名称的局部变量。

每个函数都有自己独立的局部变量,它们之间不会相互干扰。

局部变量的作用域可以有效地避免命名冲突,提高代码的可读性和可维护性。

二、全局变量的定义和作用域全局变量是在函数外部声明的变量,它们在整个程序中都可以被访问和使用。

全局变量的定义方式为在所有函数外部声明变量的语句前加上关键字"extern"和数据类型。

全局变量的作用域跨越整个程序,它们在程序开始执行时分配内存,在程序结束时释放内存。

全局变量可以在多个函数中共享数值,这对于需要在不同函数之间进行数据传递和共享的场景非常有用。

然而,全局变量的使用也需要谨慎。

过多的全局变量会增加程序的复杂性,不利于代码的维护和调试。

全局变量的值可以被任何函数修改,如果使用不当,可能会导致数据混乱和错误的结果。

三、局部变量和全局变量的差异1. 作用域:局部变量仅在函数内部可见,全局变量在整个程序中可见。

2. 生命周期:局部变量在函数执行期间存在,函数执行完毕后消失;全局变量在程序执行期间一直存在。

3. 访问限制:局部变量只能在定义它们的函数内部访问,其他函数无法直接访问;全局变量可以被所有函数访问。

4. 冲突风险:局部变量具有更小的命名冲突风险,全局变量存在更大的命名冲突可能性。

四、局部变量和全局变量的使用注意事项1. 命名冲突:在使用局部变量和全局变量时,应当避免重复使用相同的变量名,以防止命名冲突和代码混乱。

局部变量在c语言中的名词解释

局部变量在c语言中的名词解释

局部变量在c语言中的名词解释局部变量是C语言中的一个重要概念,它在程序中发挥着至关重要的作用。

本文将对局部变量进行详细解释,并探讨它的特点和用法。

一、什么是局部变量?在C语言中,局部变量是在函数内部定义的变量,也可以使用在代码块(block)内部。

与全局变量不同,局部变量只在其所在函数或代码块中可见和有效,超出其作用范围后将被销毁。

可以说,局部变量是一种临时存储数据的变量,作用域有限,仅在其所在的函数或代码块内有效。

二、局部变量的声明和定义局部变量的声明和定义遵循特定的规则。

在函数内部声明局部变量时,必须在变量名前加上数据类型以及可选的修饰符,如下所示:```cdata_type variable_name;```其中,data_type是变量的数据类型,variable_name是变量的名称。

例如,要声明一个整型的局部变量x,可以使用以下语句:```cint x;```声明局部变量并不会为变量分配内存空间,只是说明了变量的数据类型和名称。

变量的内存分配将在变量被定义时进行。

三、局部变量的生命周期局部变量的生命周期指的是变量在程序执行期间存在的时间段。

局部变量的生命周期取决于其所在的代码块或函数的执行情况。

当程序执行到函数内部声明的局部变量时,内存将被分配来存储该变量的值。

当函数执行完毕或代码块执行完毕后,局部变量将被销毁,同时释放占用的内存空间。

需要注意的是,如果局部变量具有静态存储类别(static),则其生命周期会更长,直到程序结束才会被销毁。

静态局部变量通过保留关键字static进行声明。

四、局部变量的作用域局部变量的作用域指的是变量在程序中可访问的范围。

与全局变量不同,局部变量的作用域仅限于其所在的函数或代码块内。

这意味着,除了定义它的函数或代码块外,其他函数或代码块无法直接访问局部变量。

作用域的概念非常重要,它使得程序中不同的变量名可以相同而不会产生冲突。

在一个函数内可以定义多个同名局部变量,它们之间是独立存在的,不会相互影响。

《程序设计基础——C语言》 局部变量和全局变量(十)

《程序设计基础——C语言》  局部变量和全局变量(十)

p,q的作用范围
c1,c2的作用范围
活动:分析运行结果
int a = 3 , b = 5 ; max ( int a , int b ) { int c ; c= a > b ? a : b ; return ( c ) ; } main ( ) { int } a = 8 ; printf ( “%d ” , max ( a , b )) ;
结果:8
全局变量应用
int p=1,q=5; 扩 float f1(int a) 展 后 { int b,c; c1,c2 extern char c1,c2; ……. 的 } 作 int f3() 用 {….. } 范 围 char c1,c2; char f2(int x,int y) { int i,j; …… } main() { int m,n; ……. }
全局变量示例
int a = 3 , b = 5 ; ②void gx( ) main( ) { 、 { extern int x,y; printf(“%d , %d\n “ , a , b ); 有 } x=135; 效 fun(void) 范 { … y=x+20; 围 x 、 y 是全局变量 printf(“%d , %d \n “ , a , b ) ; … printf(“%d”,y); } ①
a b

}
全局变量和局部变量的应用
全局变量和局部变量同名时,在局部变量的作用 范围全局变量无效。
int a=3,b=5; max(int a, int b) { int c; c=a>b?a:b; return(c); } main() { int a=8; printf("max=%d",max(a,b)); } 运行结果:max=8

c语言局部变量和全局变量可以同名吗

c语言局部变量和全局变量可以同名吗

c语⾔局部变量和全局变量可以同名吗
C语⾔中全局变量和局部变量的区别是他们的作⽤域不同,全局变量是整个C程序,局部变量是定义所在的⼤括号内,同⼀个作⽤域内不能定义两个同类型同名的变量,因为编译会报错。

 
由1个或者多个C⽂件组成的⼯程中,可以定义和全局变量同名同类的局部变量,但是不提倡这样使⽤,因为此时变量的值和变量被调⽤的位置有关系。

使⽤全局变量时,需要先⽤extern关键字声明,全局函数也是⽤相同的关键字。

顺便复习static关键字:
static主要定义全局静态变量、定义局部静态变量、定义静态函数。

特点
\⽤法
定义全局静态变量定义局部静态变量定义静态函数
内存全局数据区分配全局数据区分配⽆
作⽤域⽂件内定义开始到⽂件结束,其他⽂件不可⽤,
不可继承,其他⽂件可以定义重名变量
函数内定义开始到函数结束
⽂件内定义开
始到⽂件结束
可见域⽂件内定义开始到⽂件结束
函数内定义到⽂件结束,局部可⽤,但是全
局可见,局部函数返回其值可见
⽂件内定义开
始到⽂件结束。

全局变量和局部变量

全局变量和局部变量

C语言的变量一、全局变量和局部变量按照变量的有效作用范围可划分为局部变量和全局变量。

局部变量是在一个函数内部定义的变量,该变量只在定义它的那个函数范围以内有效,在此函数之外局部变量就失去意义了,因而也不能使用这些变量了。

不同的函数可以使用相同的局部变量名,由于他们的作用范围不同,不会相互干扰。

函数的形式参数也属于局部变量。

在一个函数内部的复合语句中也可以定义局部变量,该局部变量只在该复合语句中有效。

全局变量是在函数外部定义的变量,又称外部变量。

全局变量可以为多个函数共同使用,其有效的作用范围是从它定义的位置开始到整个程序文件结束为止。

如果全局变量定义在一个程序文件的开始处,则在整个程序文件范围内都可以使用它。

如果一个全局变量不是在程序文件的开始处定义的,但又希望在它的定义点之前的函数中引用该变量,这时应该在引用该变量的函数中用关键字extern将其说明为“外部变量”。

另外,如果在一个程序模块文件中引用另一个程序模块文件中定义的变量时,也必须用extern进行说明。

外部变量说明与外部变量定义是不同的。

外部变量定义只能有一次,定义的位置在所有函数之外,而同一个程序文件中的外部变量说明可以有多次,说明的位置在需要引用该变量的函数之内。

外部变量说明的作用只是声明该变量是一个已经在外部定义过了的变量而已。

如果在同一个程序文件中,全局变量与局部变量同名,则在局部变量的有效作用范围之内,全局变量是不起作用的,也就是说,局部变量的优先级比全局变量的高。

在编写C语言程序时,不是特别需要的地方就不要使用全局变量,二应当尽可能的使用局部变量。

这是因为局部变量只有在使用它时,才为其分配内存单元,二全局变量在整个程序的执行过程中都要占用内存单元。

另外,如果使用全局变量过多,在各个函数执行时都有可能改变全局变量的值,使人们难以清楚的判断出在各个程序执行点处全局变量的值,这样会降低程序的通用性和可读性。

还有一点需要说明,如果程序中的全局变量在定义时赋给了初值,按ANSI C标准规定,在程序进入主函数之前必须先对该全局变量进行初始化。

C语言 全局变量和局部变量的大小限制(堆栈区别)

C语言 全局变量和局部变量的大小限制(堆栈区别)

#include <stdio.h>int main(){int a[1000000];//局部变量return 0;}编译运行后发现溢出错误。

#include <stdio.h>int a[1000000];//全局变量int main(){return 0;}编译运行后正常。

在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分:1、栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等。

在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。

这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。

因此,能从栈获得的空间较小。

2、堆区(heap segment):一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收。

它与数据结构中的堆是两回事。

堆是向高地址扩展的数据结构,是不连续的内存区域。

这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。

堆的大小受限于计算机系统中有效的虚拟内存。

由此可见,堆获得的空间比较灵活,也比较大。

3、全局区(静态区)(data segment):全局变量和静态变量的存储区域是在一起的,程序结束后由系统释放。

数据区的大小由系统限定,一般很大。

4、文字常量区:常量字符串就是放在这里的,程序结束后由系统释放。

5、程序代码区:存放函数体的二进制代码。

综上所述,局部变量空间是很小的,我们开一个a[1000000]就会导致栈溢出;而全局变量空间在Win 32bit 下可以达到4GB,因此不会溢出。

局部变量与全局变量

局部变量与全局变量

局部变量与全局变量1.局部变量以前定义变量的语句都是出现在某一函数中,这种变量称为局部变量。

主函数中定义的变量,用户自定义函数中的形参变量,自定义函数体内定义的变量都是局部变量。

局部变量的作用只限定在它的函数内,一个函数的局部变量不能出现在其它函数中。

局部变量在程序被编译时不会分配内存空间,只有当执行调用该函数的语句时,系统为局部变量分配内存,运行结束后,局部变量会释放它占有的内存单元,该内存单元再被操作系统回收,以备再用。

这种性质可以提高内存的利用率。

有时候,局部变量也可以定义在函数体内的复合语句中,但其作用只限于该复合语句,例如:int smd(int x,int y){int i,j;...{int k;...}...}其中变量k就是定义在复合语句中的局部变量,只在复合语句中起作用。

2.全局变量在所有函数之外定义的变量称作全局变量。

在一个c语言源程序文件中,全局变量可以定义在所有函数之前,也可以定义在所有函数之后,还可以定义在任意两个函数之间。

一般情况下,定义全局变量放在文件开头所有函数的前面。

如果全局变量在定义时没有被初始化,系统自动初始化为0(char型的为'/0')。

再者注意,与局部变量相对应,全局变量在被编译时就分配了内存空间,一直保持到程序运行结束。

全局变量从定义之处到文件结束的所有函数都可以访问它,使用其当前值,或者改变其当前值,全局变量的值一旦改变,就保持这个新值,直到下一次改变。

全局变量的性质使得它能够在函数之间传递数据。

例如:在自定义函数与主函数之前,定义全局变量s l,其使用贯穿整个文件。

3.变量同名问题同一个程序内的全局变量不能同名,同一个人函数内的局部变量也不能同名。

但是,不同的函数的局部变量可以同名(两个函数不能同时被调用),同一个程序内的全局变量与它作用域内函数的局部变量也可以同名(起作用的是局部变量,全局变量被屏蔽掉)。

4.修饰符extern与static对全局变量和函数的修饰作用①.extern与static对全局变量的修饰如果c程序是由多个文件组成的,则其中一个文件中定义的全局变量的作用域从定义之处到本文件末。

C中static和volatile变量深入解析

C中static和volatile变量深入解析

详解C中static关键字有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static 进行声明。

【例8.15】考察静态局部变量的值。

f(int a){auto b=0;static c=3;b=b+1;c=c+1;return(a+b+c);}main(){int a=2,i;for(i=0;i<3;i++)printf("%d",f(a));}对静态局部变量的说明:1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。

在程序整个运行期间都不释放。

而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。

2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

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

而对自动变量来说,如果不赋初值则它的值是一个不确定的值。

【例8.16】打印 1 到5的阶乘值。

int fac(int n){static int f=1;f=f*n;return(f);}main(){int i;for(i=1;i<=5;i++)printf("%d!=%d\n",i,fac(i));}详解C中volatile关键字volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。

如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

下面举例说明。

在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;void test(){do1();while(flag==0);do2();}这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。

C语言中的变量分为全局变量和局部变量

C语言中的变量分为全局变量和局部变量

C语言中的变量分为全局变量和局部变量。

全局变量分为:1、外部变量(extern)2、内部变量(static)
全局变量声明在函数之外,默认为extern类型,外部变量(extern)对全局可见,不仅可以在文件内调用,还可以在文件外使用。

而内部变量则只可以在定义该变量的文件内使用,因此不会和同一程序的其他文件中相同的名字冲突。

全局变量一般存放在系统的静态存储区里。

局部变量分为:1、自动类型(auto)2、静态变量(static)
局部变量的默认类型为auto,存放在动态存储区的栈中,随着函数调用的结束而弹出释放,生命周期为定义该变量的函数的生命周期。

而静态变量(static) 存放在静态存储区内,某个特定函数的局部变量,只能在该函数中使用,但它与自动变量不同的是,不管其所在函数是否被调用,它都一直存在,而不像自动变量那样,随着所在函数的被调用和退出而存在和消失!一般用于不丢失,不重复的计数。

静态存储区用来存放在编译期间就已经可以确定地址空间大小的变量,动态存储区分为堆和栈,用来动态分配程序运行时才可以确定的空间。

c语言全局变量和局部变量区别

c语言全局变量和局部变量区别

c语言全局变量和局部变量区别首先要理解什么是全局变量和局部变量,然后再理解如何使用全局变量和局部变量。

一、什么是全局变量和局部变量全局变量:全局变量是指可以定义在文件或目录中的所有变量。

如果想知道程序中所有的局部变量和全局变量,就需要定义一个目录,把每个局部变量都放进去,这样就能查看所有局部变量了。

但在不同的程序中,不能在同一个目录下定义相同名字的变量,因为同名的变量会覆盖另外一个变量。

但如果两个同名的变量没有被覆盖,那这两个变量就不会互相干扰。

局部变量:局部变量是只存储在内存中的变量,一般只存储一个数据项,不占用整个内存。

它们仅仅是一些信息,在函数或过程调用时提供给该函数或过程,不包含任何实际数据。

1、与局部变量相比全局变量的修改仅影响到程序中的一处,而且还可能不被发现,所以尽量少用或不用全局变量,只要少量地用一些即可。

例如一些外部数据,在函数中参数传递、返回值传递等场合下应该用全局变量。

2、在使用全局变量时要考虑它对整个程序的影响,如果在一个函数中使用了全局变量,在返回时,有可能改变全局变量的值;此外在多个函数中,不能在同一个目录下使用相同的全局变量,否则可能导致程序混乱,错误增加。

二、使用全局变量的原则3、在声明全局变量之前必须确保其他类也已经声明过全局变量。

即,如果在定义变量时,所在的类声明了一个全局变量,那在定义类的其他成员时也必须声明相应的全局变量。

如果要定义一个带有两个头文件的程序,必须指定两个文件,第一个文件只定义一个头文件,第二个文件定义一个头文件和一个尾文件,将第二个文件的定义放在第一个文件的后面,以便在运行时将两个文件统一。

在同一个头文件中声明的全局变量,在不同的头文件中可以有不同的值,即可以同名,但不能同值。

所以必须在定义该全局变量的头文件中使用变量的定义,然后再声明其他的头文件。

4、如果在定义一个全局变量后,又声明了它的子类,那么在子类中就不允许再定义该全局变量。

5、对于同一个类的成员来说,一般不能跨类型使用全局变量,但当使用的是静态的全局变量时,不受此限制。

C语言作用域

C语言作用域

C语⾔作⽤域C语⾔作⽤域类型作⽤域⽣命周期auto变量⼀对{}内当前函数static局部变量⼀对{}内整个程序运⾏期extern变量整个程序整个程序运⾏期static全局变量当前⽂件整个程序运⾏期extern函数整个程序整个程序运⾏期static函数当前⽂件整个程序运⾏期register变量⼀对{}内当前函数局部变量与全局变量⼀、变量作⽤域C语⾔变量的作⽤域分为:代码块作⽤域(代码块是{}之间的⼀段代码)函数作⽤域⽂件作⽤域⼆、局部变量1、说明局部变量也叫auto⾃动变量(auto可写可不写),⼀般情况下代码块{}内部定义的变量都是⾃动变量,它有如下特点:在⼀个函数内定义,只在函数范围内有效在复合语句中定义,只在复合语句中有效随着函数调⽤的结束或复合语句的结束局部变量的声明声明周期也结束如果没有赋初值,内容为随机2、案例#include <stdio.h>void test(){//auto写不写是⼀样的//auto只能出现在{}内部auto int b = 10;}int main(void){//b = 100; //err,在main作⽤域中没有bif (1){//在复合语句中定义,只在复合语句中有效int a = 10;printf("a = %d\n", a);}//a = 10; //err离开if()的复合语句,a已经不存在return0;}局部变量案例使⽤#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <time.h>void fun01(int a){return0;}int main(void){// 局部变量// 定义变量:局部变量在函数内部定义的变量使⽤auto修饰、栈区存储// 作⽤域:在函数内部// ⽣命周期:从创建到函数结束// 局部变量未初始化,值为乱码auto int a = 10;printf("%d\n", a);// 局部变量I,只限于for循环使⽤for (int i = 0; i < 10; i++){break;}return0;}局部变量案例使⽤:2三、全局变量1、说明在函数外定义,可被本⽂件及其它⽂件中的函数所共⽤,若其它⽂件中的函数调⽤此变量,须⽤extern声明全局变量的⽣命周期和程序运⾏周期⼀样不同⽂件的全局变量不可重名2、案例#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <time.h>// 全局变量// 全局变量、在函数外部定义的变量、存储数据区、可以和局部变量重名// 作⽤域:整个项⽬中所有⽂件、如果在其他⽂件中使⽤需要声明 extern// ⽣命周期:从程序创建到程序销毁// 全局变量未初始化、值为0extern int a = 10;int main(void){printf("%d\n", a);int a = 123;// 匿名内部函数、执⾏完销毁{int a = 123456;printf("%d\n", a);}// 数据在操作时会采⽤就近原则printf("%d\n", a);return0;}全局变量使⽤案例四、静态(static)局部变量1、说明static局部变量的作⽤域也是在定义的函数内有效static局部变量的⽣命周期和程序运⾏周期⼀样,同时staitc局部变量的值只初始化⼀次,但可以赋值多次static局部变量若未赋以初值,则由系统⾃动赋值:数值型变量⾃动赋初值0,字符型变量赋空字符2、案例#include <stdio.h>void fun1(){int i = 0;i++;printf("i = %d\n", i);}void fun2(){//静态局部变量,没有赋值,系统赋值为0,⽽且只会初始化⼀次static int a;a++;printf("a = %d\n", a);}int main(void){fun1();fun1();fun2();fun2();return0;}静态局部变量使⽤案例#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <time.h>void fun04(){// 静态局部变量// 静态局部变量只会初始化⼀次,可以多次赋值// 正常局部变量函数执⾏完后会被销毁// 在数据区进⾏存储// 作⽤域:只能在函数中使⽤// ⽣命周期:从程序创建到程序销毁// 静态局部变量未初始化、值为0static int b = 10;b++;printf("%d\n", b);}int main(void){for (int i = 0; i < 10; i++){fun04();}return0;}静态局部变量使⽤案例:2五、静态(static)全局变量1、说明在函数外定义,作⽤范围被限制在所定义的⽂件中不同⽂件静态全局变量可以重名,但作⽤域不冲突static全局变量的⽣命周期和程序运⾏周期⼀样,同时staitc全局变量的值只初始化⼀次2、案例#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <time.h>// 静态全局变量// 作⽤域:可以在本⽂件中使⽤、不可以在其他⽂件中使⽤// ⽣命周期:程序创建到程序销毁// 静态全局变量未初始化、值为0static int c = 10;int main(void){printf("%d\n", c);return0;}静态全局变量使⽤案例六、extern全局变量声明声明⼀个变量,这个变量在别的⽂件中已经定义了,这⾥只是声明,⽽不是定义。

C语言中局部变量和全局变量等在内存中的存放位置

C语言中局部变量和全局变量等在内存中的存放位置

C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)8.8局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。

这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。

这种变量有效性的范围称变量的作用域。

不仅对于形参变量,C语言中所有的量都有自己的作用域。

变量说明的方式不同,其作用域也不同。

C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

8.8.1局部变量局部变量也称为内部变量。

局部变量是在函数内作定义说明的。

其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

例如:int f1(int a) /*函数f1*/{int b,c;……}a,b,c有效int f2(int x) /*函数f2*/{int y,z;……}x,y,z有效main(){int m,n;……}m,n有效在函数f1内定义了三个变量,a为形参,b,c为一般变量。

在f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。

同理,x,y,z的作用域限于f2内。

m,n的作用域限于main函数内。

关于局部变量的作用域还要说明以下几点:1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。

同时,主函数中也不能使用其它函数中定义的变量。

因为主函数也是一个函数,它与其它函数是平行关系。

这一点是与其它语言不同的,应予以注意。

2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。

如在前例中,形参和实参的变量名都为n,是完全允许的。

4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

例如:main(){int s,a;……{int b;s=a+b;……/*b作用域*/}……/*s,a作用域*/}【例8.12】main(){int i=2,j=3,k;{int k=8;printf("%d\n",k);}printf("%d\n",k);}本程序在main中定义了i,j,k三个变量,其中k未赋初值。

C#中的局部static变量

C#中的局部static变量

C#中的局部static变量 其实这问题没什么可讨论的,C#不⽀持局部静态变量。

但还是想了⼀下C#为什么不⽀持局部静态变量,以下均是个⼈想法。

C++和C⽀持局部静态变量,也就是在⼀个函数的内部声明⼀个静态变量,这种变量的特定如下:静态局部变量在函数内定义,但不象⾃动变量那样,当调⽤时就存在,退出函数时就消失。

静态局部变量始终存在着,也就是说它的⽣存期为整个程序的⽣命周期静态局部变量的⽣存期虽然为整个源程序,但是其作⽤域仍与⾃动变量相同,即只能在定义该变量的函数内使⽤该变量。

退出该函数后,尽管该变量还继续存在,但不能使⽤它⽣命变量的同时可以⽤初始化语句对静态变量进⾏赋值,该赋值语句只在函数第⼀次被调⽤时执⾏,即只执⾏⼀次如果没有初始化语句,则编译器采⽤该类型的默认值初始化变量 但在C#中却⽆法声明这种存在于函数内部的静态变量,会出现编译错误,仔细想来,原因可能如下: C++和C均不是完全⾯向对象的编程语⾔,即有很多函数不属于任何类或类的实例,如果需要函数的某个变量具有“保留上⼀次函数调⽤时的值”的特性,有三种⽅法:声明全局变量声明全局静态变量声明局部静态变量 全局变量和全局静态变量虽然可以实现某个变量“保留上⼀次函数调⽤时的值”的特性,但这两种变量的作⽤域较⼤,全局变量作⽤域为整个源程序,全局静态变量的作⽤域为变量声明所在的CPP⽂件,过⼤的变量作⽤域会造成安全隐患,因为该变量还可以被其他全局函数甚⾄类的成员函数调⽤,所以采⽤局部静态变量是最好的选择。

既保证了变量具有“记忆”功能,有很好的限制了变量的作⽤域或者说可见性。

与之相对,C#是完全⾯向对象的语⾔,任何变量或任何函数均应属于类或类的实例,这时C++中局部静态变量的功能可以由类的静态成员变量来实现,唯⼀不同的地⽅便是该变量的可见性的最⼩范围是类的内部(私有静态变量),⽽不是C++中局部静态变量的函数内部,稍微扩⼤了变量的作⽤域。

但我认为这个缺憾是可以接受的,否则或破坏“类”这个概念的完备性,在⾯向对象的编程的语⾔中,类或类实例是最基本的组成单元,类的任何成员在类内部都应该是可见的,如果有局部静态变量这个概念存在,那么就好像你的家中有⼀部车,但是你却没有权利去开⼀样。

CC++中局部全局变量初始值或默认值问题

CC++中局部全局变量初始值或默认值问题

CC++中局部全局变量初始值或默认值问题转载⽂章,仅供学习⽤,https://nd/2015/10/05/cpp-variable-init.html在C语⾔中的全局变量和静态变量都是会⾃动初始化为0,堆和栈中的局部变量不会初始化⽽拥有不可预测的值。

C++保证了所有对象与对象成员都会初始化,但其中基本数据类型的初始化还得依赖于构造函数。

下⽂来详细探讨C风格的”默认初始化”⾏为,以及C++中成员变量的初始化规则。

初始化的语法很多⼈⾄今不知道C++中如何正确地初始化⼀个变量,我们⾸先来解决语法的问题。

C语⾔中在声明时⽤=即可完成初始化操作。

但我们偏向于使⽤C++风格(本⽂中均指⾯向对象程序设计风格)来初始化内置类型:// C 风格int i = 3;int arr[] = {1, 2, 3};// C++ 风格int i(3);int i = int(3);int *p = new int(3);int* arr = new int[3] {1, 2, 3};在C语⾔中int a;表⽰声明了整型a但未初始化,⽽C++中的对象总是会被初始化的,⽆论是否写了圆括号或者是否写了参数列表,例如:int basic_var; // 未初始化:应⽤"默认初始化"机制CPerson person; // 初始化:以空的参数列表调⽤构造函数默认初始化规则定义基本数据类型变量(单个值、数组)的同时可以指定初始值,如果未指定C++会去执⾏默认初始化(default-initialization)。

那么什么是”默认初始化”呢?栈中的变量(函数体中的⾃动变量)和堆中的变量(动态内存)会保有不确定的值;全局变量和静态变量(包括局部静态变量)会初始化为零静态和全局变量的初始化所以函数体中的变量定义是这样的规则://C++中int i; // 不确定值int i = int(); // 0int *p = new int; // 不确定值int *p = new int(); // 0静态和全局变量的初始化未初始化的和初始化为零的静态/全局变量编译器是同样对待的,把它们存储在进程的BSS段(这是全零的⼀段内存空间)中。

C语言中局部变量和全局变量等在内存中的存放位置

C语言中局部变量和全局变量等在内存中的存放位置

C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)8.8局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。

这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。

这种变量有效性的范围称变量的作用域。

不仅对于形参变量,C语言中所有的量都有自己的作用域。

变量说明的方式不同,其作用域也不同。

C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

8.8.1局部变量局部变量也称为内部变量。

局部变量是在函数内作定义说明的。

其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

例如:int f1(int a) /*函数f1*/{int b,c;……}a,b,c有效int f2(int x) /*函数f2*/{int y,z;……}x,y,z有效main(){int m,n;……}m,n有效在函数f1内定义了三个变量,a为形参,b,c为一般变量。

在f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。

同理,x,y,z的作用域限于f2内。

m,n的作用域限于main函数内。

关于局部变量的作用域还要说明以下几点:1)主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。

同时,主函数中也不能使用其它函数中定义的变量。

因为主函数也是一个函数,它与其它函数是平行关系。

这一点是与其它语言不同的,应予以注意。

2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。

如在前例中,形参和实参的变量名都为n,是完全允许的。

4)在复合语句中也可定义变量,其作用域只在复合语句范围内。

例如:main(){int s,a;……{int b;s=a+b;……/*b作用域*/}……/*s,a作用域*/}【例8.12】main(){int i=2,j=3,k;{int k=8;printf("%d\n",k);}printf("%d\n",k);}本程序在main中定义了i,j,k三个变量,其中k未赋初值。

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

一般的来说,函数是可以返回局部变量的。

局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。

因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。

但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。

因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。

准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。

下面以函数返回局部变量的指针举几个典型的例子来说明:
1:
1.#include <stdio.h>
2.char *returnStr()
3.{
4. char *p="hello world!";
5. return p;
6.}
7.int main()
8.{
9. char *str;
10. str=returnStr();
11. printf("%s\n", str);
12. return 0;
13.}
这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

2:
1.#include <stdio.h>
2.char *returnStr()
3.{
4. char p[]="hello world!";
5. return p;
6.}
7.int main()
8.{
9. char *str;
10. str=returnStr();
11. printf("%s\n", str);
12. return 0;
13.}
"hello world!"是局部变量存放在栈中。

当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。

intfunc()
1.{
2. int a;
3. ....
4. return a; //允许
5.}
6.
7.int * func()
8.{
9. int a;
10. ....
11. return &a; //无意义,不应该这样做
12.}
局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,
因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部
自动变量
被抛弃,这个指针指向一个不再存在的对象,是无意义的。

但可以返回指向局部静态变量的指针,因为静态变量的生存
期从定义起到程序结束。

4:如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。

如下:
1.#include <stdio.h>
2.char *returnStr()
3.{
4. static char p[]="hello world!";
5. return p;
6.}
7.int main()
8.{
9. char *str;
10. str=returnStr();
11. printf("%s\n", str);
12.
13. return 0;
14.}
5:数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。

返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。

如下:
1.int* func( void )
2.{
3. static int a[10];
4. ........
5. return a;
6.}
6:返回指向堆内存的指针是可以的
1.char *GetMemory3(intnum)
2.{
3.char *p = (char *)malloc(sizeof(char) * num);
4.return p;
5.}
6.void Test3(void)
7.{
8.char *str = NULL;
9.str = GetMemory3(100);
10.s trcpy(str, "hello");
11.c out<<str<<endl;
12.f ree(str);
13.}
程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。

动态内存的生存期由程序员自己决定,使用非常灵活。

相关文档
最新文档