C语言入门-全局变量

前端之家收集整理的这篇文章主要介绍了C语言入门-全局变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、全局变量

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

      三、被隐藏的全局变量

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

      #include <stdio.h>
      
      int f(void);
      
      
      // 全局变量
      int gALL = 12;
      
      
      int main(int argc,gALL);
      
      	return 0;
      }
      
      int f(void)
      {
          // 这里定义一个名字相同的变量,那么全局的就被隐藏了
      	int gALL = 1;
      	printf("in %s gALL=%d\n",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. 静态本地变量的初始化只会在第一次进入这个函数时做,以后进入函数时会保持上次离开的值
      4. @H_404_9@
        #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\n",all);
        	all += 9;
        	printf("agn in %s all=%d\n",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在这里的意思就是局部作用域(本地可以访问)
        5. @H_404_9@

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

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

            下面的写法就是很危险的

            #include <stdio.h>
            
            int* f(void);
            void g(void);
            
            int main(int argc,char const *argv[])
            {
            	int *p = f();
            	printf("*p = %d\n",*p);
            	g();
            	printf("*p = %d\n",*p);
            
            	return 0;
            }
            
            int* f(void)
            {
            	int i = 12;
            
            	// 返回本地变量的地址是危险的
            	return &i;
            }
            
            void g(void)
            {
            	int k = 24;
            	printf("k = %d\n",k);
            }
            
            // *p = 12
            // k = 24
            // *p = 24
            

            tips

            1. 不要使用全局变量来在函数间传递参数和结果
            2. 尽量避免使用全局变量
            3. 使用全局变量和静态本地变量的函数是线程不安全的
            4. @H_404_9@

猜你在找的C&C++相关文章