zoukankan      html  css  js  c++  java
  • C语言学习全局变量

    一.全局变量
    • 定义在函数外面的变量是全局变量
    • 全局变量具有全局的生存期和作用域
    • 它们与任何函数都无关
    •在任何函数内部都可以使用它们

    二.全局变量初始化
    • 没有做初始化的全局变量会得到0值
    • 指针会得到NULL值
    • 只能⽤用编译时刻已知的值来初始化全局变量
    • 它们的初始化发生在main函数之前

    #include  <stdio.h>
    
    int f(void);
    
    int gAll = 12;
    
    int main(int argc, char const *argv[])
    {
        printf("in %s gAll=%d
    ",__func__,gAll);  //__func__打印函数名字 
        f();
        printf("agn in %s gAll=%d
    ",__func__,gAll);
        return 0;
    }
    
    int f(void)
    {
        printf("in %s gAll=%d
    ",__func__,gAll);
        gAll +=2;
        printf("agn in %s gAll=%d
    ",__func__,gAll);
        return gAll;
    }

    被隐藏的全局变量
    • 如果函数内部存在与全局变量同名的变量,则全局变量被隐藏

    三.静态本地变量
    • 在本地变量定义时加上static修饰符就成为静态本地变量

    • 当函数离开的时候,静态本地变量会继续存在并保持其值

    • 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开时的值

    • 静态本地变量实际上是特殊的全局变量
    • 它们位于相同的内存区域
    • 静态本地变量具有全局的生存期,函数内的局部作用域

    • static在这里的意思是局部作用域(本地可访问)

    #include  <stdio.h>
    
    int f(void);
    
    int gAll =12;
    
    int main(int argc,char const *argv[])
    {
        f();
    //    f();
    //    f();
        return 0;
    }
    int f(void)
    {
        int k =0;
        static int all =1;
        printf("&gAll=%p
    ",&gAll);
        printf("&all=%p
    ",&all); //静态本地变量 其实就是特殊的全局变量 
        printf("&k=%p
    ",&k);
        printf("in %s all=%d
    ",__func__,all);
        all +=2;
        printf("agn in %s all =%d
    ",__func__,all);
        return all;
    }

     四.*返回指针的函数
    • 返回本地变量的地址是危险的
    • 返回全局变量或静态本地变量的地址是安全的
    • 返回在函数内malloc的内存是安全的,但是容易造成问题

    • 最好的做法是返回传入的指针

    #include <stdio.h>
    int *f(void);
    void g(void);
    
    int main(int argc, char const *argv[])
    {
        int *p= f();
        printf("*p=%d
    ",*p);
        g();
        printf("*p=%d
    ",*p);
        return 0;
    }
    
    int *f(void)
    {
        int i=12;
        printf("&i=%p
    ",&i); 
        return &i;
        
    }
    
    void g(void)
    {
        int k=24;
        printf("&k=%p
    ",&k); 
        printf("k=%d
    ",k);
    }

     tips
    • 不要使用全局变量来在函数间传递参数和结果
    • 尽量避免使用全局变量
    • 丰田汽车的案子
    • *使用全局变量和静态本地变量的函数是线程不安的

  • 相关阅读:
    java传递String参数
    C++ string与int的互相转换
    java插入排序
    凸包Graham Scan算法实现
    求平面上N点最远两点和最近两点距离
    求最大公约数
    n个数连接得到最小或最大的多位整数(携程)
    Java快排
    背包问题
    二分查找离左边元素最近的(可以等于)
  • 原文地址:https://www.cnblogs.com/guoweilf/p/11506376.html
Copyright © 2011-2022 走看看