原文鏈接: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在這兩個函數里的變化