zoukankan      html  css  js  c++  java
  • C语言入门-全局变量

    一、全局变量

    1. 定义在函数外面的变量是全局变量
    2. 全局变量具有全局的生存期和作用域
    3. 它们与任何函数无关,在任何函数内部都可以使用它们
    #include <stdio.h>
    
    int f(void);
    
    
    // 全局变量
    int gALL = 12;
    
    
    int main(int argc, char const *argv[])
    {
    	printf("in %s gALL=%d
    ", __func__,gALL);
    	f();
    
    	printf("agn in %s gALL=%d
    ", __func__,gALL);
    
    	return 0;
    }
    
    int f(void)
    {
    	printf("in %s gALL=%d
    ", __func__,gALL);
    	gALL += 8;
    	printf("agn in %s gALL=%d
    ", __func__,gALL);
    	return gALL;
    }
    
    
    // in main gALL=12
    // in f gALL=12
    // agn in f gALL=20
    // agn in main gALL=20
    

    二、全局变量初始化

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

    三、被隐藏的全局变量

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

    #include <stdio.h>
    
    int f(void);
    
    
    // 全局变量
    int gALL = 12;
    
    
    int main(int argc, char const *argv[])
    {
    	printf("in %s gALL=%d
    ", __func__,gALL);
    	f();
    
    	printf("agn in %s gALL=%d
    ", __func__,gALL);
    
    	return 0;
    }
    
    int f(void)
    {
        // 这里定义一个名字相同的变量,那么全局的就被隐藏了
    	int gALL = 1;
    	printf("in %s gALL=%d
    ", __func__,gALL);
    	gALL += 8;
    	printf("agn in %s gALL=%d
    ", __func__,gALL);
    	return gALL;
    }
    // in main gALL=12
    // in f gALL=1
    // agn in f gALL=9
    // agn in main gALL=12
    
    

    四、静态本地变量

    1. 在本地变量定义时加上static修饰符就成为静态本地变量
    2. 当函数离开的时候,静态本地变量会继续存在并保持其值
    3. 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开的值
    #include <stdio.h>
    
    int f(void);
    
    int main(int argc, char const *argv[])
    {
    	f();
    	f();
    
    	return 0;
    }
    
    int f(void)
    {
    	static int all = 1;
    	printf("in %s all=%d
    ", __func__,all);
    	all += 9;
    	printf("agn in %s all=%d
    ", __func__,all);
    	return all;
    }
    // in f all=1
    // agn in f all=10
    // in f all=10
    // agn in f all=19
    
    

    注意事项

    1. 静态本地变量实际上是特殊的全局变量
    2. 它们位于相同的内存区域
    3. 静态本地变量具有全局的生存期,函数内的局部作用域
    4. static在这里的意思就是局部作用域(本地可以访问)

    五、后记:返回指针的函数

    1. 返回本地变量的地址是危险的
    2. 返回全局变量或静态本地变量的地址是安全的
    3. 返回在函数内malloc的内存是安全的,但是容易造成问题
    4. 最好的做法是返回传入的指针

    下面的写法就是很危险的

    #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;
    
    	// 返回本地变量的地址是危险的
    	return &i;
    }
    
    void g(void)
    {
    	int k = 24;
    	printf("k = %d
    ", k);
    }
    
    // *p = 12
    // k = 24
    // *p = 24
    

    tips

    1. 不要使用全局变量来在函数间传递参数和结果
    2. 尽量避免使用全局变量
    3. 使用全局变量和静态本地变量的函数是线程不安全的
  • 相关阅读:
    【翻译/介绍】jump consistent hash:零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法 [2015-03-13]
    现代密码学实践指南[2015年]
    本博客迁走了
    高性能web系统的架构和系统优化
    vs 2013调试的时候重启的解决方案
    年会与项目管理
    javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
    成长
    POCO exception
    通过OpenGL ES在iOS平台实践增强现实(二)
  • 原文地址:https://www.cnblogs.com/mengd/p/11761904.html
Copyright © 2011-2022 走看看