精华内容
下载资源
问答
  • 断断续续地写代码是很痛苦的事情,得不偿失,失不再来,重头在学,循环往复,日渐消瘦,头...c语言中的全局变量局部变量、静态全局变量、静态局部变量: 如果局部变量名和全局变量名一样时,忽略全局变量的值。 ...

    断断续续地写代码是很痛苦的事情,得不偿失,失不再来,重头在学,循环往复,日渐消瘦,头秃心凉……
    故此立下flog:

    坚持更新自己的每日所学!

    一、c语言中的全局变量、局部变量、静态全局变量、静态局部变量:
    在这里插入图片描述
    (注意:如果局部变量名和全局变量名一样时,忽略全局变量的值。

    二、指针——*的使用:

    • 定义时,使用 * 指明变量是一个指针变量,如:int *p,这里的 int *是一个数据类型(和int完全不是一个数据类型);
    • 在定义后 ,使用指针变量p表示的是地址的值的时候就不用再带 * ,而当要获取指针变量p指向的数据的值的时候,使用 *p,此时的 * 作指针运算符。
    展开全文
  • C/C++变量根据定义位置的不同,具有不同的作用域和存储域。 作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 ...当然,其它不包括全局变量定义的

    C/C++变量根据定义位置的不同,具有不同的作用域和存储域

    作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

    存储可分为2种:静态存储区和栈区,另:函数申请内存空间在堆区里面(这不在本文讨论范围之内)。

    首先,从作用域看,

    全局变量具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件。当然,其它不包括全局变量定义的源文件,需要用extern关键字再次声明该全局变量,之后才可以在该源文件中使用;

    静态全局变量具有全局作用域,它与全局变量的区别在于,如果程序包含多个文件的话,作用于定义自己的文件里,不能作用于其它源文件中,即被static关键字修饰过的变量具有文件作用域。所以即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量;

    局部变量具有局部作用域,它是自动(auto)类型,在程序运行期间不是一直存在,只有在函数执行期间存在,函数的一次调用结束后,变量所占用的内存即被收回;

    静态局部变量具有局部作用域,它只被初始化一次,从第一次初始化到程序运行结束都一直存在,即使函数调用结束后也仍然存在,但不可被其它函数调用,因其只对定义自己的函数体可见

    其次,从存储域(也即内存分配空间)看,

    全局变量、静态全局变量、静态局部变量都在静态存储区分配空间,而局部变量在栈区分配空间。

    1、静态存储区里的数据可以在下一次调用的时候保持原来的赋值,这是其与栈变量和堆变量的最大区别。

    2、静态变量用关键字static告知编译器自己的作用域。

    3、函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    从以上分析可以看出,局部变量改变为静态局部变量后是改变存储方式,即改变了生存周期;而把全局变量改变为静态变量后是改变了作用域,限制了其使用范围。


    另外详细对比静态局部变量与自动局部变量的区别:

    1、一般情况下,不作专门说明的局部变量,均是自动变量,可用关键字auto作出说明,称作为自动局部变量。不存在自动全局变量,全局变量的类型只能定义为extern或static。

    2、静态局部变量属于静态存储类别,在静态存储区内分配存储分配单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。

    3、静态局部变量是在编译时赋初值的,且只赋值一次。在程序运行时它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    4、如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0或空字符。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新分配存储单元,而所分配单元的值是不确定。

    5、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。

    展开全文
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们放在静态数据存储区,全局可见; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中

    A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。


    时间(生命周期)——>在内存空间分配上

    空间(作用域) ——>在作用范围上

    展开全文
  • 对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量...

    1、局部变量能否和全局变量重名?   

      答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: " 

        局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 

    2、如何引用一个已经定义过的全局变量?   

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


    3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  

      答:可以,在不同的C文件中以static形式来声明同名全局变量。前提是只能有一个C文件中对此变量赋初值,连接才不会出错 

     

    4、语句for( ;1 ;)有什么问题?它是什么意思?  

      答:和while(1)相同。 


    5、do……while和while……do有什么区别?   

      答:前一个循环一遍再判断,后一个判断以后再循环   

    6、请写出下列代码的输出内容   

    #include <stdio.h>     
    main()     
    {      
    int a,b,c,d;      
    a=10;   
    b=a++;    
    c=++a;    
    d=10*a++;   
    printf( "b,c,d:%d,%d,%d",b,c,d);   
    return 0;   
    } 

     

     答:10,12,120 


    7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 

    答:static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

           static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

           static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

     

    (1)用static定义的全局变量,构成静态的全局变量,若是一个源程序由多个源文件组成,一般的全局变量在各个源文件中都是有效的,而用static修饰的全局变量只在定义该变量的源文件中是有效的,因此static限制了全局变量的作用范围。
    (2)普通局部变量在所在的函数每次调用的时候都会被重新分配存储空间,函数结束后,就会回收该存储空间。而用static修饰的局部变量不会,它的值始终保持着。
    (3)static函数与普通函数作用域不同,它仅作用于定义它的源文件中。

    (4)储存方式:程序的局部变量存在于(堆栈)中,全局变量存在于(静态区/全局区)中,动态申请(new)数据存在于(堆)中。

      

    8.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?


    c用宏定义,  #define S(a,b) a*b

    c++用inline  

    引入内联函数的目的是为了解决程序中函数调用的效率问题。内联函数是指用inline关键字修饰的函数。任何在类的说明部分定义的

    函数都会被自动的认为是内联函数。

    它与一般函数所不同之处只在于函数调用的处理。

    内联函数必须是和函数体声明在一起才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数声明,

    我们必须定义函数体。

    Inline tablefunction(int I) {return I*I};  这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。

    但是执行速度确比一般函数的执行速度要快。

    (C#有无内联函数:C#就没有头文件,哪来的内联外联?要说内联,应该全都是内联,因为所有函数什么的都定义在一个文件里。存在内联函数,但要注意,在何处内联代码的决定完全由CLR做出,我们无法使用像C++中inline这样的关键字来控制那些方法是内联的。)

     

     

    全局变量、局部变量、静态全局变量、静态局部变量的区别

    C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

    从作用域看:

    全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

    静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

    局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

    静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

    从分配内存空间看:
    全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

     

     

    全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

        1)、静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
      2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    Tips:
      A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
      B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
      C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
        D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
        E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

    -----------------------------------------------------------------------------------------------------------

    static 全局变量:改变作用范围,不改变存储位置

    static 局部变量:改变存储位置,不改变作用范围

    静态函数 :在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

                    如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数也称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可。

     

     

    参考:

    https://www.cnblogs.com/burandanxin/archive/2009/10/16/1584735.html

    https://blog.csdn.net/Zhanganliu/article/details/79185251

    展开全文
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • 概念首先得明白局部变量,静态局部变量全局变量,静态全局变量这几个概念,以下面程序举例://main.cpp int a = 0; //全局变量 static int b=0;//静态全局变量 main() { int c; //局部变量 static int d;//静态...
  • 全局变量局部变量静态全局变量、静态局部变量的区别转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 it ...
  • 原文:蚊子132 C++中函数局部变量指针是如何释放的呢? 
  • 静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束一直存在,它和全局变量的区别在于全局变量对所有的函数是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域
  • 全局变量局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用域...
  • #include static int ax,mx; static int bx=1,nx=2; void main() { int i; char *p="asd";... printf("%d,%d,%d\n",ax,bx,i);... printf("ax:%X\nmx=%X\nbx=%X\nnx=%X\ni=%X\np=%X\nasd=%X\n",&ax,&mx,&bx,&nx,&i,
  • 想问一下,修改下面代码中的全局变量后,在打印pstr变量时,为什么在反汇编代码中看到callq 5e0 (栈检查失败),这是pstr的地址指向出现了问题吗,求大佬详细地解答 ``` #include #include #include ...
  • 从作用域看: 全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件...静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直
  • 但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过...
  • 1.局部变量指针和局部指针变量是两个不同概念 2.局部变量在函数体结束后生命期也结束,它的指针(即它的地址)是无效变量的地址,所以函数不能返回这种地址值 3,局部指针变量在函数结束后生命期也结束,但它...
  • 1.SetValue这个函数,是将局部的开辟的Node变量存储在链表或者list中,然后通过析构函数去释放,一般情况下,局部变量不能作为返回值,局部变量离开了函数范围,就会释放,为什么这里可以完好的保存。 2....
  • static有两种用法:面向...全局变量局部变量、静态全局变量、静态局部变量的区别  C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,
  • 1、全局变量 定义:在所有函数外部定义的变量cheng
  • C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。...静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直
  • 转自:全局变量局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用...
  • C++函数返回局部变量指针的问题

    千次阅读 2015-11-08 16:48:34
    讲这个问题之前要先简单讲一下C++的内存管理。...1)堆(heap):new的存放在这里,属于动态分配,如果在程序中调用delete释放掉,那么将一直存在,直到程序结束,由程序释放掉。 2)栈(stack):由系统
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域,它
  • 局部变量全局变量区别

    千次阅读 2016-12-09 23:02:02
    局部变量:在使用之前必须赋初始值。  例如:int var = 0;  System.out.println(var);...按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,399
精华内容 49,759
关键字:

局部变量的指针都给全局变量指针