精华内容
下载资源
问答
  • 本文主要是对c语言全局变量和局部变量进行了问题汇总。
  • 主要介绍了C语言 全局变量和局部变量详解及实例的相关资料,需要的朋友可以参考下
  • C语言全局变量定义方法

    万次阅读 多人点赞 2019-07-09 16:05:46
    C语言全局变量定义方法     今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义过全局变量啊,但是先前怎么没错误?...

    C语言全局变量定义方法

        今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义过全局变量啊,但是先前怎么没错误?瞎折腾了一会最后还是发现问题出在细节上面了。以前只是侥幸没遇到而已。今天做个总结,以后再忘记了就回来直接查一下。

         我们都知道定义在函数外部的变量就叫做全局变量,但是通常只有一个C文件和一个H文件的时候那样定义是不会出问题的。一个大的系统会包含好多个.C文件和.H文件,每个.C文件都有可能会访问全局变量,所以全局变量在定义的时候就要稍微做下改变了。通常的做法是建立一个包含系统所有全局变量的.H文件,系统用到的所有全局变量都定义在该文件内,文件名可以用Global修饰一下。在该文件中定义某个全局变量的时候需要用extern声明该变量为外部变量。比如要定义SysEventCounter标志为unsigned char型的全局变量可以这样定义:

     

    extern unsigned char SysEventCounter; <----这里是关键,不能对该变量赋值,只能声明,赋值就会报错。

    上述声明是写在.H文件中的。其他.C文件若要用到该变量,直接包含该.H文件就可以了

     

    如果想要赋初值,可以在用到它的.C文件中这样写:

    unsigned char SysEventCounter = 0;

    不用赋初值时,直接

    unsigned char SysEventCounter;

    就可以了。注意:只需要在一个.C文件中写即可,其他.C文件直接可以用。如果在其他.C文件中也这样写会产生重复定义的错误。

    全局变量对变量的类型不限制,任何类型都可以,只要按照上述方法定义就不会有错误。


    展开全文
  • C语言全局变量的缺陷 和 全局变量建议的写法 C语言全局变量的缺陷 #include &lt;stdio.h&gt; int a; int a; int a = 0;//定义,其他是声明 int a; int a; //有1次是定义,有3次是声明 int c; int c; int c...
    C语言全局变量的缺陷 和 全局变量建议的写法

    C语言全局变量的缺陷

    #include <stdio.h>
    
    int a;
    int a;
    int a = 0;//定义,其他是声明
    int a;
    int a;
    
    //有1次是定义,有3次是声明
    int c;
    int c;
    int c;
    int c;
    
    //1、如果定义一个全局变量,没有赋值(初始化),无法确定是定义,还是声明
    //2、如果定义一个全局变量,同时初始化,这个肯定是定义
    
    int main(int argc, char const *argv[])
    {
    	//只有声明,没有定义,无法给变量赋值
    	//extern int b = 10;
    
    	c = 10;
    	printf("b = %d\n", b);
    
    	return 0;
    }
    

    C语言全局变量建议的写法

    #include <stdio.h>
    //1、定义一个全局变量,建议初始化
    int a = 10;
    
    //2、如果声明一个全局变量,建议加extern
    extern int a;
    
    int main(int argc, char const *argv[])
    {
    	
    	return 0;
    }
    
    展开全文
  • C语言全局变量和局部变量总结 逐夸父2016-11-19 11:37:2154035收藏40 版权 ————————————————————————————————————————————————————————————...

    C语言全局变量和局部变量总结

    逐夸父 2016-11-19 11:37:21  54035  收藏 40

    版权

     

    —————————————————————————————————————————————————————————————————————————————

     

    只有不断的学习,不断的进步,才能不被替代!

     

    只有你的不可替代性才决定你的价值!

     

    -----2016年11月18日

     

    —————————————————————————————————————————————————————————————————————————————

     

    第一部分问题:

    今天一个小伙伴问我一个问题,如图程序1:

     

    咋一看没有问题啊,后来想想确实有问题,这个c=a+a;似乎是语句,必须在函数体内才能执行,后来就看到这么一句话:

    赋值语句需要有函数执行,c语言最基本的执行体是函数,你可以初始化,但不能在函数体外赋值。

    在VC++中,确实出错,指针的地方出错,错误提示:

    错误说的是:初始化必须是一个常量。

    然后我就去掉运算的c。如图程序2:

    显示可以正常运行的。然后就比较郁闷,就问了QQ好友(矩阵)。正确答案如下:

    函数体外只能进行初始化,不能进行赋值运算。如图程序3:

    提示的错误是:变量a被重复赋初值。

    其实正确的理解就是:函数体外只能进行初始化,不能进行赋值运算。为什么第二个程序可以执行?

    因为,C语言执行过程中,对代码进行了优化,把程序2中的 int a; a=10;  优化为一句话:int a=10;这就是初始化。所以程序2是正确的,程序3中,初始化过程中:int a=10;int a=17;肯定就出错了。重复初始化。程序1中,语句必须在函数体内执行,函数体外只能进行初始化。

     

    第二部分全局变量与局部变量

    定义:

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

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

    全局变量的例子,如图程序4:

    提示的错误是 变量 x 没有定义,原因是:

    C语言代码是从前往后依次执行的,由于 x 定义在函数 func1() 之后,所以在 func1() 内无效;修改程序如下,程序5:

     

    可以看出,输出正确的答案,所以全局变量必须定义在我们需要用它的函数体之前。

    然后,在看下局部变量:

    注意事项:

    ①在main函数中定义的变量也是局部变量,只能在main函数中使用;同时,main函数中也不能使用其他函数中定义的变量。main函数也是一个函数,与其它函数地位平等。

    ②形参变量、在函数体内定义的变量都是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。

    ③可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互补干扰,也不会发生混乱。

    ④在语句块(由一对{}包含的若干条语句)中也可以定义变量,它的作用域只限于当前的语句块。

     

    一道综合练习题:

     

    ①先调用fun1(),在fun1()中,有局部变量n,所以输出的结果是  n:20;

    ②对于fun2(),使用了形参,形参的作用范围也是整个函数内(实参给形参传值的过程也就是给局部变量赋值的过程),所以输出的结果是  n:30;

    ③对于fun3(),没有局部变量,所以全局变量定义的 n 对所有的函数都可见。所以输出的结果是  n:10;

    ④根据局部变量注意事项第四条。所以输出的结果是  n:40;

    ⑤3C语言规定,只能从小的作用域向大的作用域中去寻找变量,而不能反过来,使用更小的作用域中的变量。对于 main() 函数,即使代码块中的 n 离输出语句更近,但它仍然会使用 main() 函数开头定义的 n,所以输出结果是 30。

     

    所以结果是:

     

    第三部分内存的分区和变量的存储

     

    内存中供用户使用的存储空间分为三部分:程序区  、静态存储区、动态存储区。

    变量的分类:

    ①从空间上分配:从变量的作用域可以分成:局部变量和全局变量。

    ②从变量的存在时间(生存周期)可以分成:静态存储和动态存储。

    静态存储:程序在运行期间分配固定的存储方式。

    动态存储:程序在运行期间根据需要动态的分配存储空间。

    全局变量全部存储在静态存储区。在程序开始执行过程中给全局变量分配空间,程序执行完毕就释放空间。程序执行过程中固定的分配空间,而不需要动态进行分配是释放。

    动态存储区主要存放以下数据:函数的形参、自动变量(没有加static的局部变量)、函数调用的现场现场保护和返回值。

    动态存储区的数据,在函数开始调用时分配动态存储空间,函数结束时释放这些空间。

    C语言中每个变量有两个属性:第一数据类型;第二存储属性。

    auto 变量:

    函数中的局部变量,如果不专门的声明为 static存储,都是动态分配存储空间。数据存储在动态存储区内。函数中的形参和函数中的变量都属于此类,调用该函数时候系统自动的分配空间,在函数结束的时候,释放该空间。这些局部变量被称为自动变量。自动变量用 auto关键字声明(可以省略auto )。

    static 变量:

    有时候希望我们调用的函数在释放的时候不消失能保留原值,这就需要定义为静态局部变量。用关键字 static声明。
    看一段程序:

    对静态局部变量的说明:
    1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
    2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
    3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。

    register变量
    为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

    说明:
    1) 只有局部自动变量和形式参数可以作为寄存器变量;
    2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;
    3)局部静态变量不能定义为寄存器变量。

     

    用extern声明外部变量
    外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

    extern 例子:

    在 main 函数体外定义的变量,A 、B(外部变量:它的作用域为从变量定义处开始,到本程序文件的末尾。)。想要在main中引用必须加关键字:extern 。

     

    第三部分:C语言的堆与栈

    和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

     

     

     

    展开全文
  • C语言全局变量和局部变量同名时的使用 全局变量作用域为程序的始终,局部变量作用于当前函数。 在声明了同名变量的方法中,使用局部变量的数值 在未声明同名变量的方法中,使用全局变量的数值 开始未声明局部变量,...

    C语言全局变量和局部变量同名时的使用

    全局变量作用域为程序的始终,局部变量作用于当前函数。
    在声明了同名变量的方法中,使用局部变量的数值
    在未声明同名变量的方法中,使用全局变量的数值
    开始未声明局部变量,后来又声明,后来的调用中使用局部变量的数值
    学习中后续继续更新······

    展开全文
  • 【引用】c语言全局变量和局部变量问题汇总  2011-04-09 11:16:37| 分类: c语言专题 | 标签: |字号大中小 订阅 本文引用自yongzi《c语言全局变量和局部变量问题汇总》 1、局部变量能否和全局变量重名? ...
  • c语言全局变量和局部变量The scope is a particular region in the program, where variables, constants have their existence and can be accessed. In other words, we can say that “the area where a ...
  • C语言全局未初始化数据段分析 https://blog.csdn.net/candcplusplus/article/details/12576185#commentBox C语言全局变量那些事儿 https://www.cnblogs.com/alantu2018/p/8503447.html
  • 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用”::” 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,...
  • C语言全局变量多文件使用

    千次阅读 2015-05-25 10:49:51
    C语言全局变量多文件使用 定义一个全局变量,想在多个文件中使用,代码如下: //var.h extern int var ;   //var.c #include"var.h" int var = 10;   //otherA.c...
  • c语言全局变量和局部变量

    千次阅读 2010-01-30 23:06:00
    c语言全局变量和局部变量1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用:: (注:在Linux中用gcc编译可能会出错,需要用g++编译)局部变量可以与全局变量同名,在函数内引用这个...
  • 全局变量 静态本地变量 下一篇: 全局变量 一、定义 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 他们与任何函数都无关 在任何函数内部都可以使用他们 实验: int f(void ); ...
  • <code class="hljs language-cpp">#include<iostream> using namespace std; int a=43; int b=...全局变量为啥可以赋值变量值 ...c语言版本全局变量为啥不能赋值变量</code></pre>  </p>
  • 【引用】c语言全局变量和局部变量问题汇总 2011-04-09 11:16:37|分类: c语言专题 |标签: |字号大中小订阅 本文引用自yongzi《c语言全局变量和局部变量问题汇总》 1、局部变量能否和全局变量重名? 答:能,...
  • C语言做一个加法运算结果放到全局变量 #include <stdio.h> int g_n = 10; void Plus() { int i = 10; int k = 20; g_n = i + k; } int main(int argc,char* argv[]) { Plus(); return 0; } 反...
  • 汇编语言程序可通过地址间访问在C语言程序中声明的全局变量。通过使用IMPORT***引入全局变量,并利用LDR和STR指令根据全局变量的地址来访问它们。对于不同类型的变量,需要采用不同选项的LDR和STR指令:unsigned ...
  • 全局变量 定义 全局变量:定义在函数外部的变量 #include<stdio.h> int gA=10; //全局变量 void f() { printf("f %d",gA); //f 10 } int main() { printf("main %d\n",gA);//main 10 f(); ...
  • 1.作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等。 2.内存存储方式不同:全局变量存储在全局数据区中,而局部变量存储在栈区。 3.生命周期不同:全局数据变量的生命周期和主程序...
  • C语言全局变量和局部变量

    千次阅读 2019-02-22 08:35:24
    不仅对于形参变量C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是...
  • 在《C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。所谓作用域(Scope),就是变量的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,138
精华内容 4,055
关键字:

c语言全局变量

c语言 订阅