【轉】全局變量、靜態全局變量、靜態局部變量和普通局部變量的區別


原文鏈接:https://blog.csdn.net/qq_39736982/article/details/82685277

 

按存儲區域分:

1、全局變量、靜態全局變量和靜態局部變量都存放在內存的全局數據區

2、局部變量存放在內存的棧區


按作用域分:  

1、全局變量在整個工程文件內都有效;

2、靜態全局變量只在定義它的文件內有效;

3、靜態局部變量只在定義它的函數內有效,且程序僅分配一次內存,函數返回后,該變量不會消失;局部變量在定義它的函數內有效,但是函數返回后失效。
4、全局變量和靜態變量如果沒有手工初始化,則由編譯器初始化為0。局部變量的值不可知。

5、靜態局部變量與全局變量共享全局數據區,但靜態局部變量只在定義它的函數中可見。靜態局部變量與局部變量在存儲位置上不同,使得其存在的時限也不同,導致對這兩者操作 的運行結果也不同。


#include <stdio.h>
 
void func();//函數聲明,主要是因為被調用的函數定義寫在了main函數后面了
 
int n = 1; //全局變量
 
int  main(void)
{
    static int a; // 靜態局部變量,但靜態局部變量只在定義它的函數中可見,並且只初始化一次
    int b = -10; // 局部變量
 
    printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
 
    b += 4;
 
    func();
 
    printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
    n += 10;
 
    func();
    printf("main:   a=%d,   b=%d,   n=%d\n",a,b,n);
 
}
void func()
{
    static int a = 2; // 靜態局部變量
    int b = 5; // 局部變量
    a += 2;
    n += 12;
    b += 5;
   printf("func:   a=%d,   b=%d,   n=%d\n",a,b,n);
}

  

運行結果: 

 

 結果分析:

 首先明確main函數和func函數里面都有靜態局部變量a和局部變量b,由於它們的固有性質,它們都只在定義它的函數里有效,所以它們互不干擾,所以只要在本函數里分析即可,而全局變量n,在main和func函數里都有效,所以分析它的值應該考慮n在這兩個函數里的變化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM