C语言静态局部变量和全局变量有什么区别,不都是在整个程序中都有效吗。希望能举个简单的例子,谢谢啦 C语言静态局部变量和全局变量有什么区别?

C\u8bed\u8a00\uff0c\u5168\u5c40\u53d8\u91cf\u548c\u5c40\u90e8\u53d8\u91cf\u6709\u4ec0\u4e48\u533a\u522b

\u5168\u5c40\u53d8\u91cf\u5c31\u662f\u6574\u4e2a\u6e90\u7a0b\u5e8f\u90fd\u6709\u6548\u7684\u53d8\u91cf\uff1b\u800c\u5c40\u90e8\u53d8\u91cf\u4f1a\u5728\u5176\u6240\u5c5e\u7684\u51fd\u6570\u6216\u5faa\u73af\u7b49\u7ed3\u675f\u540e\u6d88\u4ea1\u3002\u6574\u4e2a\u7a0b\u5e8f\u90fd\u8981\u7528\u7684\u53d8\u91cf\u5b9a\u4e49\u5168\u5c40\u53d8\u91cf\uff0c\u5982\u679c\u5c31\u662f\u67d0\u4e2a\u51fd\u6570\u7528\u7684\u8bdd\uff0c\u5c31\u5b9a\u4e49\u5c40\u90e8\u53d8\u91cf\uff0c\u4ee5\u4fbf\u5176\u4ed6\u51fd\u6570\u53ef\u4ee5\u91cd\u65b0\u5b9a\u4e49\u540c\u540d\u53d8\u91cf\u6765\u4f7f\u7528\u3002 \u8981\u662f\u90fd\u7528\u5168\u5c40\u53d8\u91cf\uff0c\u90a3\u9047\u5230\u5927\u7a0b\u5e8f\u65f6\uff0c\u7a0b\u5e8f\u662f\u7531\u4e0d\u540c\u4eba\u5206\u522b\u7f16\u5404\u81ea\u7684\u6a21\u5757\u6216\u51fd\u6570\uff0c\u4e0d\u80fd\u907f\u514d\u5b9a\u4e49\u540c\u540d\u53d8\u91cf\uff0c\u5230\u65f6\u5c31\u4f1a\u51b2\u7a81\u3002

(1)\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u5728\u51fd\u6570\u5185\u5b9a\u4e49\uff0c\u4f46\u4e0d\u8c61\u81ea\u52a8\u53d8\u91cf\u90a3\u6837\uff0c\u5f53\u8c03\u7528\u65f6\u5c31\u5b58\u5728\uff0c\u9000\u51fa\u51fd\u6570\u65f6\u5c31\u6d88\u5931\u3002\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u59cb\u7ec8\u5b58\u5728\u7740\uff0c\u4e5f\u5c31\u662f\u8bf4\u5b83\u7684\u751f\u5b58\u671f\u4e3a\u6574\u4e2a\u6e90\u7a0b\u5e8f\u3002 \u3000\u3000
(2)\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u7684\u751f\u5b58\u671f\u867d\u7136\u4e3a\u6574\u4e2a\u6e90\u7a0b\u5e8f\uff0c\u4f46\u662f\u5176\u4f5c\u7528\u57df\u4ecd\u4e0e\u81ea\u52a8\u53d8\u91cf\u76f8\u540c\uff0c\u5373\u53ea\u80fd\u5728\u5b9a\u4e49\u8be5\u53d8\u91cf\u7684\u51fd\u6570\u5185\u4f7f\u7528\u8be5\u53d8\u91cf\u3002\u9000\u51fa\u8be5\u51fd\u6570\u540e\uff0c \u5c3d\u7ba1\u8be5\u53d8\u91cf\u8fd8\u7ee7\u7eed\u5b58\u5728\uff0c\u4f46\u4e0d\u80fd\u4f7f\u7528\u5b83\u3002 \u3000\u3000\u3000\u3000
(3)\u5bf9\u57fa\u672c\u7c7b\u578b\u7684\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u82e5\u5728\u8bf4\u660e\u65f6\u672a\u8d4b\u4ee5\u521d\u503c\uff0c\u5219\u7cfb\u7edf\u81ea\u52a8\u8d4b\u4e880\u503c\u3002\u800c\u5bf9\u81ea\u52a8\u53d8\u91cf\u4e0d\u8d4b\u521d\u503c\uff0c\u5219\u5176\u503c\u662f\u4e0d\u5b9a\u7684\u3002
\u6839\u636e\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u7684\u7279\u70b9\uff0c \u53ef\u4ee5\u770b\u51fa\u5b83\u662f\u4e00\u79cd\u751f\u5b58\u671f\u4e3a\u6574\u4e2a\u6e90\u6587\u4ef6\u7684\u91cf\u3002\u867d\u7136\u79bb\u5f00\u5b9a\u4e49\u5b83\u7684\u51fd\u6570\u540e\u4e0d\u80fd\u4f7f\u7528\uff0c\u4f46\u5982\u518d\u6b21\u8c03\u7528\u5b9a\u4e49\u5b83\u7684\u51fd\u6570\u65f6\uff0c\u5b83\u53c8\u53ef\u7ee7\u7eed\u4f7f\u7528\uff0c \u800c\u4e14\u4fdd\u5b58\u4e86\u524d\u6b21\u88ab\u8c03\u7528\u540e\u7559\u4e0b\u7684\u503c\u3002 \u56e0\u6b64\uff0c\u5f53\u591a\u6b21\u8c03\u7528\u4e00\u4e2a\u51fd\u6570\u4e14\u8981\u6c42\u5728\u8c03\u7528\u4e4b\u95f4\u4fdd\u7559\u67d0\u4e9b\u53d8\u91cf\u7684\u503c\u65f6\uff0c\u53ef\u8003\u8651\u91c7\u7528\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u3002\u867d\u7136\u7528\u5168\u5c40\u53d8\u91cf\u4e5f\u53ef\u4ee5\u8fbe\u5230\u4e0a\u8ff0\u76ee\u7684\uff0c\u4f46\u5168\u5c40\u53d8\u91cf\u6709\u65f6\u4f1a\u9020\u6210\u610f\u5916\u7684\u526f\u4f5c\u7528\uff08\u5c24\u5176\u662f\u77ed\u540d\u5168\u5c40\u53d8\u91cf\u7684\u53d8\u91cf\u540d\u6c61\u67d3\u5f88\u4e25\u91cd\uff09\uff0c\u56e0\u6b64\u4ecd\u4ee5\u91c7\u7528\u5c40\u90e8\u9759\u6001\u53d8\u91cf\u4e3a\u5b9c\u3002
\u7b80\u5355\u7684\u8bf4\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u4e0e\u5168\u5c40\u53d8\u91cf\u6700\u660e\u663e\u7684\u533a\u522b\u5c31\u5728\u4e8e\uff1a\u5168\u5c40\u53d8\u91cf\u5728\u5176\u5b9a\u4e49\u540e\u6240\u6709\u51fd\u6570\u90fd\u80fd\u7528\uff0c\u4f46\u662f\u9759\u6001\u5c40\u90e8\u53d8\u91cf\u53ea\u80fd\u5728\u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u7528\u3002

按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
代码如下:
//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1()
{
cout < <b < <endl < <a < <endl;//结果为5
}

//main.cpp
int a;
int b=10;
void func2()
{
static int i;
i++;
cout < <i < <endl;
}

void func1();

void main()
{
a=20;
func1();
func2();
func2();
}
输出结果为
5
20
1
2

静态局部变量只能在定义该变量的函数内使用,全局变量可以在任意函数内使用。

首先要清楚“整个程序”这个概念。
一个程序由多个编译单位组成。每个可进行单独编译的源文件称为“编译单位”。
在同一编译单位内用EXTERN说明符来扩展全局变量的作用域。
当用STATIC说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量只限于本编译单位使用,不能被其它编译单位所引用。

单就你这个问题,回答就一句话,作用域不一样。
简单例子:
静态局部变量:只有定义这个变量的当前cpp能找到他的定义,其他cpp哪怕extern这个变量,包含对头文件,要用,编译都会报错找不到。(至于生命周期,好比a.cpp里main函数,b.cpp里定义一个B类,类里面一个函数里static int i(默认为0),并打印,赋另外一个值2,再打印,a.cpp里调用B类里这个函数两次,第一次打印0,2;第二次打印2,2,就是说明这个变量在程序没关的时候,哪怕出了b.cpp,static int i的静态局部变量的值还在(但是你就是没法直接在a.cpp里extern来用这个i,要想这么干,请用全局变量))
ps:静态局部变量和静态全局变量也差不多这意思,作用域,前者定义他的大括号里可用,后者定义它的cpp文件里随便用。静态就是指作用域只在定义它的范围(局部or全局)
全局变量:同一个程序,其他cpp里面只要extern这个变量,就能找到这个变量,且只要加好锁,这个程序没关掉,这个变量的数值就有确实含义(没被delete)

(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。   
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。     
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(尤其是短名全局变量的变量名污染很严重),因此仍以采用局部静态变量为宜。
简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能用,但是静态局部变量只能在一个函数里面用。

  • C璇█涓鐨static鍙橀噺鑳芥敼鍚嶅悧?
    绛旓細鍙互锛宻tatic鍦C璇█涓鏄〃绀轰竴涓彉閲忎负闈欐佸彉閲忕殑锛岃屼笉鏄父閲忥紝涔熶笉鏄笉鍙彉鐨勫彉閲忋傛墍璋撶殑闈欐佸彉閲忔湁涓ょ鎯呭喌锛屼竴绉嶆槸闈欐鍏ㄥ眬鍙橀噺锛屼竴绉嶆槸闈欐佸眬閮ㄥ彉閲銆傚厛璇撮潤鎬佸眬閮ㄥ彉閲忥細閫氬父鎯呭喌涓嬶紝鍦ㄤ竴涓嚱鏁颁腑瀹氫箟涓涓彉閲忥紝閭d箞鍑芥暟閫鍑轰箣鍚庯紝杩欎釜鍙橀噺灏辨秷澶变簡锛屽嵆浣夸綘绗簩娆¤皟鐢ㄨ繖涓嚱鏁帮紝閲岄潰鐨勫彉閲忎篃浼氳...
  • C璇█,鍏ㄥ眬鍙橀噺鍜屽眬閮ㄥ彉閲忔湁浠涔堝尯鍒
    绛旓細鍏ㄥ眬鍙橀噺灏辨槸鏁翠釜婧愮▼搴忛兘鏈夋晥鐨勫彉閲忥紱鑰灞閮ㄥ彉閲浼氬湪鍏舵墍灞炵殑鍑芥暟鎴栧惊鐜瓑缁撴潫鍚庢秷浜°傛暣涓▼搴忛兘瑕佺敤鐨勫彉閲忓畾涔夊叏灞鍙橀噺锛屽鏋滃氨鏄煇涓嚱鏁扮敤鐨勮瘽锛屽氨瀹氫箟灞閮ㄥ彉閲忥紝浠ヤ究鍏朵粬鍑芥暟鍙互閲嶆柊瀹氫箟鍚屽悕鍙橀噺鏉ヤ娇鐢ㄣ傝鏄兘鐢ㄥ叏灞鍙橀噺锛岄偅閬囧埌澶х▼搴忔椂锛岀▼搴忔槸鐢变笉鍚屼汉鍒嗗埆缂栧悇鑷殑妯″潡鎴栧嚱鏁帮紝涓嶈兘閬垮厤瀹氫箟...
  • C璇█鍏ㄥ眬鍙橀噺涓庡眬閮ㄥ彉閲鐨勫尯鍒湁鍝簺
    绛旓細灞閮ㄥ彉閲锛氬湪绋嬪簭涓紝鍙湪鐗瑰畾鐨勮繃绋嬫垨鍑芥暟涓彲浠ヨ闂殑鍙橀噺锛屾槸鐩稿涓庡叏灞鍙橀噺鑰岃█鐨勩傚叏灞鍙橀噺涔熺О涓哄閮ㄥ彉閲忥紝鏄湪鍑芥暟鐨勫閮ㄥ畾涔夌殑锛屽畠鐨勪綔鐢ㄥ煙涓轰粠鍙橀噺瀹氫箟澶勫紑濮嬶紝鍒版湰绋嬪簭鏂囦欢鐨勬湯灏俱傚叏灞鍙橀噺鍏ㄩ儴瀛樻斁鍦闈欐瀛樺偍鍖猴紝鍦ㄧ▼搴忓紑濮嬫墽琛屾椂缁欏叏灞鍙橀噺鍒嗛厤瀛樺偍鍖猴紝绋嬪簭琛屽畬姣曞氨閲婃斁銆傚眬閮ㄥ彉閲忓彲浠鍜屽叏灞鍙...
  • C璇█涓彉閲鐨勫瓨鍌ㄧ被鍨嬫湁鍝嚑绉,瀛樺偍鏂瑰紡鍝嚑绉?璋㈠柦
    绛旓細鍦C璇█涓锛屽鍙橀噺鐨勫瓨鍌ㄧ被鍨嬭鏄庢湁浠ヤ笅鍥涚锛1銆乤uto 鑷姩鍙橀噺 2銆乺egister 瀵勫瓨鍣ㄥ彉閲 3銆乪xtern 澶栭儴鍙橀噺 4銆static 闈欐佸彉閲 鎵璋撳瓨鍌ㄧ被鍨嬫槸鎸囧彉閲忓崰鐢ㄥ唴瀛樼┖闂寸殑鏂瑰紡锛屼篃绉颁负瀛樺偍鏂瑰紡銆傚彉閲忕殑瀛樺偍鏂瑰紡鍙垎涓衡滈潤鎬佸瓨鍌ㄢ濆拰鈥滃姩鎬佸瓨鍌ㄢ濅袱绉嶃1銆侀潤鎬佸瓨鍌ㄥ彉閲忛氬父鏄湪鍙橀噺瀹氫箟鏃跺氨鍦ㄥ瓨鍌ㄥ崟鍏冨苟...
  • c璇█:static闂
    绛旓細鑰岄潤鎬鍏ㄥ眬鍙橀噺鍒欓檺鍒朵簡鍏朵綔鐢ㄥ煙锛 鍗冲彧鍦ㄥ畾涔夎鍙橀噺鐨勬簮鏂囦欢鍐呮湁鏁堬紝 鍦ㄥ悓涓婧愮▼搴忕殑鍏跺畠婧愭枃浠朵腑涓嶈兘浣跨敤瀹冦傜敱浜庨潤鎬佸叏灞鍙橀噺鐨勪綔鐢ㄥ煙灞闄愪簬涓涓簮鏂囦欢鍐咃紝鍙兘涓鸿婧愭枃浠跺唴鐨勫嚱鏁板叕鐢紝 鍥犳鍙互閬垮厤鍦ㄥ叾瀹冩簮鏂囦欢涓紩璧烽敊璇備簩銆闈欐佸眬閮ㄥ彉閲 static澹版槑鐨勫眬閮ㄥ彉閲忓湪璋冪敤缁撴潫鍚庝笉娑堝け鑰屼繚鐣欏師鍊硷紝鍗...
  • C璇█浠g爜缁勬垚 - BSS銆丏ata銆丼tack銆丠eap銆丆ode銆丆onst
    绛旓細鍗虫眹鎬讳笅鏉ワ紝浠g爜鍙互鍒嗕负6閮ㄥ垎缁勬垚锛屽寘鎷細BSS鍖猴紙鏈垵濮嬪寲鐨鍏ㄥ眬鍙橀噺/闈欐佸彉閲鍖猴級銆丏ata鍖猴紙瀹炲鍖栫殑鍏ㄥ眬鍙橀噺鍖猴級銆丼tack鍖猴紙鏍堝尯锛夈乭eap鍖猴紙鍫嗗尯锛夈丆ode鍖猴紙浠g爜鍖猴級銆乧onst鍖猴紙甯搁噺鍖猴級銆備竴銆丅SS鍖哄拰Data鍖 C璇█缂栫▼涓畾涔夌殑鍏ㄥ眬鍙橀噺銆闈欐佸眬閮ㄥ彉閲锛屽氨鏄垎閰嶅湪鍏ㄥ眬鍙橀噺/闈欐佸彉閲忓尯鍩燂紝浣嗘槸...
  • 鍏ㄥ眬鍙橀噺 涓 static鍨嬬殑灞閮ㄥ彉閲 鏈浠涔堝尯鍒
    绛旓細C璇█鍏ㄥ眬鍙橀噺鍜屽眬閮ㄥ彉閲 寮曞瓙--- ? ?? ???鍙橀噺鍙互鍦ㄧ▼搴忎腑涓変釜鍦版柟璇存槑: 鍑芥暟鍐呴儴銆佸嚱鏁扮殑鍙傛暟瀹氫箟涓垨鎵鏈夌殑鍑芥暟澶栭儴銆傛牴鎹墍瀹氫箟浣嶇疆鐨勪笉鍚, 鍙橀噺鍙垎涓哄眬閮ㄥ彉閲忋佸舰寮忓弬鏁板拰鍏ㄧ▼鍙橀噺銆備粠绌洪棿瑙掑害鏉ョ湅锛屽彉閲忓彲浠ュ垎涓哄叏灞鍙橀噺鍜屽眬閮ㄥ彉閲忥紝鑰屼粠鏃堕棿瑙掑害鏉ュ垎鐨 鍙互鏈闈欐瀛樺偍鍙橀噺鍜屽姩鎬佸瓨鍌ㄥ彉閲忎箣鍒...
  • 鍙橀噺鐨闈欐瀛樺偍涓庡姩鎬佸瓨鍌
    绛旓細棣栧厛锛岄潤鎬佸瓨鍌ㄤ笌鍔ㄦ佸瓨鍌ㄩ兘鏄彉閲忓湪鍐呭瓨涓殑瀛樺偍鏂瑰紡銆C璇█涓彉閲鍒嗕负灞閮ㄥ彉閲忥紙auto锛夈佸瘎瀛樺櫒鍙橀噺锛坮egister锛夈鍏ㄥ眬鍙橀噺锛坋xtern锛夈闈欐佸彉閲锛static锛夈灞閮ㄥ彉閲忓拰瀵勫瓨鍣ㄥ彉閲忓湪鍐呭瓨涓互鍔ㄦ佸瓨鍌ㄧ殑鏂瑰紡瀛樺偍锛屽閮ㄥ彉閲忓拰闈欐佸彉閲忓湪鍐呭瓨涓互闈欐佸瓨鍌ㄧ殑鏂瑰紡瀛樺偍銆傦紙绗旇呮敞锛欳璇█涓嶅瓨鍦ㄧ湡姝f剰涔変笂鐨勨滃叏灞...
  • 鍏充簬C璇█鍏ㄥ眬鍙橀噺涓庡眬閮ㄥ彉閲鐨勯棶棰.
    绛旓細鍦ㄦ嫭鍙蜂綋閲寋}瀹氫箟鐨勬槸灞閮ㄥ彉閲锛屽畠鐨勭敓鍛藉懆鏈熸槸璇ュ潡缁撴潫銆傚眬閮ㄥ彉閲忛渶瑕佽嚜宸卞垵濮嬪寲锛屽苟涓斾綅浜庡爢鏍堜腑銆傚鏋滅敤static鍓嶇紑锛屽鍦ㄦ簮鏂囦欢寮澶寸殑璇濇槸鏈師鏂囦欢鐨鍏ㄥ眬鍙橀噺锛屽鏋滃湪鎵鏈夊嚱鏁板墠瀹氫箟涓嶅姞static鐨勮瘽灏辨槸鍏ㄥ眬鍙橀噺銆 --- 杩欎釜闈欐佺殑闈炲父澶嶆潅锛闈欐佸叏灞鍜屽叏灞鍜屽眬閮ㄩ兘涓嶄竴鏍凤紝闈欐佸叏灞瀹為檯涓婄敓鍛藉懆鏈熶笉鍚...
  • 鍦C璇█涓,鍏ㄥ眬鍙橀噺鐨勫瓨鍌ㄧ被鍒槸?
    绛旓細鍏ㄥ眬鍙橀噺鐨勫瓨鍌ㄧ被鍒槸闈欐瀛樺偍鍖恒傚彉閲忓垎涓哄眬閮涓庡叏灞锛灞閮ㄥ彉閲鍙堝彲绉颁箣涓哄唴閮ㄥ彉閲忋傜敱鏌愬璞℃垨鏌愪釜鍑芥暟鎵鍒涘缓鐨勫彉閲忛氬父閮芥槸灞閮ㄥ彉閲忥紝鍙兘琚唴閮ㄥ紩鐢紝鑰屾棤娉曡鍏跺畠瀵硅薄鎴栧嚱鏁板紩鐢ㄣ傚叏灞鍙橀噺鏃㈠彲浠ユ槸鏌愬璞″嚱鏁板垱寤猴紝涔熷彲浠ユ槸鍦ㄦ湰绋嬪簭浠讳綍鍦版柟鍒涘缓銆傚叏灞鍙橀噺鏄彲浠ヨ鏈▼搴忔墍鏈夊璞℃垨鍑芥暟寮曠敤銆傜敱涓嬪浘鍙互...
  • 扩展阅读:静态局部变量不正确 ... 静态全局变量的作用域 ... 静态局部变量的生存期 ... 静态局部变量有什么用 ... 全局变量可以声明吗 ... c 全局变量 ... c语言静态变量生存期 ... 静态局部变量再次调用 ... c语言静态局部变量是什么 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网