zoukankan      html  css  js  c++  java
  • 局部变量,全局变量,extend,static

    main.c

    #include <stdio.h>
    #include "zs.h"
    /*
     局部变量是定义在函数、代码块、函数形参列表。存储在栈中,从定义的那一行开始作用域结束释放。
     
     全局变量:写在函数,代码块,形参列表外的变量,从定义的那一行开始一直直到文件末尾(暂时这样认为),全局变量如果没有进行初始化是0,存储在静态区中, 随着程序的结束而结束。
     */
     
     
    /*
     全局变量分为两种:
     1.外部全局变量:
        可以被其它文件访问的全局变量我们称之为外部全局变量(默认情况下所有的全局变量都是外部全局变量。)。 多个同名的外部全局变量指向同一块存储空间。
     2.内部全局变量:
        只能被当前文件访问的全局变量我们称之为内部全局变量。只要给全局变量加上static关键字就是内部全局变量,多个同名的内部全局变量如果不在同一个文件中,那么指向不同的存储空间。
        
        */
     
     /*
     为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量, static修改的全局变量就是内部全局变量, 只能在当前文件中使用
     这样就可以提高我们全局变量的安全性。
     
     如果多个文件中存在同名的内部全局变量, 相互不会影响
     如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量
     
     
     extern:
        用于声明一个外部全局变量
        声明只需要在使用变量之前声明就可以了,声明不会开辟存储空间
     static:
        用于定义一个内部全局变量,定义会开辟存储空间    
        
     */
    
    int num; // 外部全局变量,可以定义多个同名的全局变量,
    int num;
    int num;
    
    static int num; // 内部全局变量 998
    
    int main(int argc, const char * argv[]) {
        num = 998;
        test();
        printf("mian.c = num = %i
    ", num);
        return 0;
    }

    zs.c

    #include "zs.h"
    
    /*
    int num; // 不允许,由于Xcode升级之后检验导致的, 在Xcode6以前是可以的
    如果直接在zs.c当中定义外部全局变量num, 那么我们说过同名的外部全局变量指向同一块存储空间,
     那么如果在多个文件中有同名的外部全局变量, 可能导致A文件的数据被B文件不小心修改了
     降低了数据的封装性, 提高了发生错误的概率,所以不建议在不同的文件写同名的全局变量。
    */
    
    
    // extern代表声明一个全局变量,注意:声明全局变量和声明函数一样,仅仅是告诉系统我们有这个全局变量,但并不会真在的开辟存储空间。
    extern int num;
    
    static int num; // 0  666
    
    int num; // 0 666
    
    
    void test()
    {
        extern int num;//声明也可以写在函数里面,只要在使用之前就可以。    
        printf("zs.c = num = %i
    ", num); // 0
        num = 666;
    }
    int num;

    zs.h

    void test();

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

    main.c

    //
    //  main.c
    //  static对局部变量的作用
    
    #include <stdio.h>
    
    
    void test()
    {
        int a = 0; // 局部变量,栈里面
        
        // 当使用static来修饰局部变量, 那么会延长局部变量的生命周期, 并且会更改局部变量存储的位置 , 将局部变量从栈转移到静态区中
        // 只要使用static修改局部变量之后, 当执行到定义局部变量的代码就会分配存储空间, 但是只有程序结束才会释放该存储空间
        
        static int b = 0;//静态区
        a++; // 1
        b++; // 1  2
        printf("a = %i
    ", a); // 1
        printf("b = %i
    ", b); // 1
        printf("------------
    ");
    }
    
    
    void demo(int r)
    {
        /*
         应用场景":
         当某个方法的调用频率非常高, 而该方法中更有些变量的值是固定不变的
         那么这个时候就可以使用static来修饰该变量, 让该变量只开辟一次存储空间
         这样可以提高程序的效率和性能
         */
        static double pi = 3.1415926; // 固定
        double res = pi * r * r;
        printf("res = %lf
    ", res);
    }
    int main(int argc, const char * argv[]) {
        
        test();//1,1
        test();//1,2
        
        for (int i = 0; i < 100; i++) {
            demo(i);
        }
        
        return 0;
    }

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

    main.c

    //
    //  main.c
    //  extern和static对函数的作用
    
    #include <stdio.h>
    #include "zs.h"  //导入头文件就可以
    
    void demo();  //由于demo函数没有加static默认所有文件都可以访问,所以在main中使用之前声明demo就可以了。不声明也可以访问。
    /*
     函数也分为内部函数和外部函数,
     默认情况下所有的函数都是外部函数,
     可以被其它文件访问的函数称之为外部函数,
     只能在当前文件中范文的函数称之为内部函数。
     */
    int main(int argc, const char * argv[]) {
        
        test();
        demo();
        return 0;
    }
    
    
    extend用在全局变量,表示声明一个全局变量不会开辟空间。
    extend用于函数表示外部全局函数(一般不写,函数默认都是外部的)。
    
    static用在全局变量表示定义一个内部全局变量,只能在本文件中使用。
    static用在局部变量表示把局部变量放在静态区,多次引用是同一个。
    static用在函数表示内部函数,只在本文件中使用。

    zs.h

    //
    //  zs.h
    //  day10
    
    void test();
    extern void test();
    
    // 在.h中声明一个内部函数没有任何意义,因为别人看得到但是用不了。
    static void demo();

    zs.c

    //
    //  zs.c
    //  day10
    
    #include "zs.h"
    
    // 声明内部函数一般用于内部函数定义在后面, 而想在定义之前使用内部函数
    static void demo();
    
    // 只要在函数的返回值前面加上一个extern就可以让函数变为一个外部函数, 由于默认就是外部函数, 所以在开发中一般情况extern没人写
    // 如果extern写在函数的实现中, 代表定义一个外部函数
    // 如果extern写在函数的声明中, 代表声明一个外部函数
    extern void test()
    {
        printf("test printf
    ");
        demo();
    }
    
    // 不加static默认所有文件都可以访问。static让函数变为内部函数, 其它文件就不能访问了。
    // 如果static写在函数的实现中, 代表定义一个内部函数
    // 如果static写在函数的声明中, 代表声明一个内部函数
    static void demo()
    {
        printf("demo printf
    ");
    }
  • 相关阅读:
    队列(queue)、优先队列(priority_queue)、双端队列(deque)
    20150720工作总结
    Spring使用远程服务之Hessian
    iBaits中SqlMapClientTemplate的使用
    java中常见的异常类
    java笔试面试中的坑
    java面试中常用的排序算法
    IBatis和Hibernate区别
    单例和多线程
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/yaowen/p/7398211.html
Copyright © 2011-2022 走看看