C语言动态变量和静态变量的区别 在C语言中静态变量和动态变量的区别,应该如何理解

C\u8bed\u8a00\u4e2d\u9759\u6001\u53d8\u91cf\u4e0e\u52a8\u6001\u53d8\u91cf\u7684\u5b9a\u4e49\u4e0e\u533a\u522b

\u52a8\u6001\u53d8\u91cf\u548c\u9759\u6001\u53d8\u91cf\u5b9a\u4e49\u548c\u533a\u522b\u5982\u4e0b\uff1a
1\u3001\u5b9a\u4e49\u4e0a\uff0c\u9759\u6001\u53d8\u91cf\u6bd4\u52a8\u6001\u53d8\u91cf\u591a\u4e00\u4e2a\u5173\u952e\u5b57static\uff0c\u6bd4\u5982\uff1a
\u52a8\u6001\u53d8\u91cf\uff1aint i;
\u9759\u6001\u53d8\u91cf\uff1astatic int i;
2\u3001\u52a8\u6001\u53d8\u91cf\u5728\u5b50\u7a0b\u5e8f\u4e2d\uff0c\u6bcf\u6b21\u8c03\u7528\u65f6\u90fd\u4f1a\u4ece\u96f6\u5f00\u59cb\uff0c\u4e0d\u4f1a\u4fdd\u7559\u539f\u6709\u6570\u636e\uff0c\u9759\u6001\u53d8\u91cf\u8c03\u7528\u65f6\u539f\u6709\u503c\u4e0d\u4f1a\u53d1\u751f\u6539\u53d8\uff0c\u6bd4\u5982\uff1a
main()
{
int i;
for(i=0;i<5;i++)fun();//fun1();
}
void fun() //\u8f93\u51fa\u7ed3\u679c\u4e3a11111
{
int j;
j++;
printf("%d",j);
}

void fun1() //\u8f93\u51fa\u7ed3\u679c\u4e3a12345
{
static int j;
j++;
printf("%d",j);
}

\u9759\u6001\u53d8\u91cf\u5c31\u662f\u7a0b\u5e8f\u5728\u6267\u884c\u524d\u5c31\u5df2\u7ecf\u53ef\u4ee5\u786e\u5b9a\u7684\u5730\u5740\u7684\u53d8\u91cf\u3002\u666e\u901a\u53d8\u91cf\u5219\u662f\u5728\u7a0b\u5e8f\u6267\u884c\u540e\u624d\u5206\u914d\u7684\u5730\u5740\u7684\u53d8\u91cf\u3002\u6240\u4ee5\u9759\u6001\u53d8\u91cf\u5bf9\u6574\u4e2a\u7a0b\u5e8f\u90fd\u662f\u53ef\u89c1\u7684\uff0c\u666e\u901a\u53d8\u91cf\u53ea\u80fd\u88ab\u7ed9\u5176\u5206\u914d\u5730\u5740\u7684\u6a21\u5757\u4f7f\u7528\uff0c\u8d85\u51fa\u8fd9\u4e2a\u6a21\u5757\u666e\u901a\u53d8\u91cf\u7684\u751f\u547d\u5468\u671f\u7ed3\u675f\u3002

一、形式不同:

静态变量是在定义的时候,有static 修饰的变量,形式为static TYPE var_name = init_value;

动态变量,形式为TYPE var_name = init_value;即没有static 修饰,其中的=init_value均可省略。

二、作用不同:

动态全局变量:作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量,生命周期为从程序运行到程序退出,即贯穿整个运行时间。

静态全局变量:作用域为当前文件,从定义/声明位置到文件结尾,生命周期为从程序运行到程序退出,即贯穿整个运行时间。

常量使用

静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。

编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

以上内容参考:百度百科-静态变量



静态变量,就是在定义的时候,有static 修饰的变量,形式为
static TYPE var_name = init_value;
而动态变量,形式为
TYPE var_name = init_value;
即没有static 修饰。其中的=init_value均可省略。
区分定义在函数外的全局变量,和函数内的局部变量,作用域,生命周期,及无显式初始化时的初始值,均有区别。
1 动态全局变量:
作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。
生命周期为从程序运行到程序退出,即贯穿整个运行时间。
无显式初始化时默认初始化值为0。

2 静态全局变量:
作用域为当前文件,从定义/声明位置到文件结尾。
生命周期为从程序运行到程序退出,即贯穿整个运行时间。
无显式初始化时默认初始化值为0。

3 动态局部变量:
作用域为当前函数,从定义位置,到其所在的{}的结束位置。
生命周期为从函数调用到函数退出。
无显式初始化时默认初始化值为随机值。

4 静态局部变量:
作用域为当前函数,从定义位置,到其所在的{}的结束位置。
生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值。
无显式初始化时默认初始化值为0。

全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!

最大的区别就是静态变量在其作用域里的值会有一个储存空间,而这个空间在程序结束之前是不会被删除的,所以静态变量在执行程序时会保留前一次执行的值,也就是只能被初始化一次。而动态变量是可以一直处于赋值语句中。

建议看英文教材,翻译的东西增加理解障碍,英语的重要性就在这里。
动态变量就是函数内部定义的变量,internal variables,auto variables. 作用域限制在函数内部,生命周期就是函数结束,变量就销毁了。再次调用该函数,变量是重新生成的。函数内定义的静态static变量,作用域还是函数内部,生命周期是整个程序的运行和结束,该变量一直存在,每次调用该函数,只是保持变量值的更新。函数内部的static改变的是生命周期。
全局变量,external variables, 作用域是整个程序。external static variables 是作用域被限制到了本源文件内,在其他源文件不可见。函数外部变量,也就是全局变量,static改变的是作用域。
翻译的名称很容易让人困惑。当然你理解了,不存在障碍,但是在你没理解的时候,这些名称是让人增加困惑的。

  • C璇█鍔ㄦ佸彉閲忓拰闈欐佸彉閲忕殑鍖哄埆
    绛旓細涓銆佸舰寮忎笉鍚岋細闈欐佸彉閲忔槸鍦ㄥ畾涔夌殑鏃跺锛屾湁static 淇グ鐨勫彉閲忥紝褰㈠紡涓簊tatic TYPE var_name = init_value;鍔ㄦ佸彉閲忥紝褰㈠紡涓篢YPE var_name = init_value锛涘嵆娌℃湁static 淇グ锛屽叾涓殑=init_value鍧囧彲鐪佺暐銆備簩銆浣滅敤涓嶅悓锛氬姩鎬佸叏灞鍙橀噺锛氫綔鐢ㄥ煙涓烘暣涓」鐩紝鍗虫渶缁堢紪璇戞垚鍙墽琛屾枃浠剁殑鎵鏈夋枃浠朵腑鍧囧彲浠ヤ娇鐢...
  • 璁$畻鏈C璇█涓鈥鍔ㄦ佸彉閲鈥濆拰鈥闈欐佸彉閲鈥鐨勫尯鍒鏄粈涔?
    绛旓細鍖哄垎瀹氫箟鍦ㄥ嚱鏁板鐨勫叏灞鍙橀噺锛屽拰鍑芥暟鍐呯殑灞閮ㄥ彉閲忥紝浣滅敤鍩燂紝鐢熷懡鍛ㄦ湡锛屽強鏃犳樉寮忓垵濮嬪寲鏃剁殑鍒濆鍊硷紝鍧囨湁鍖哄埆銆1 鍔ㄦ佸叏灞鍙橀噺锛氫綔鐢ㄥ煙涓烘暣涓」鐩紝鍗虫渶缁堢紪璇戞垚鍙墽琛屾枃浠剁殑鎵鏈夋枃浠朵腑鍧囧彲浠ヤ娇鐢ㄥ姩鎬佸叏灞鍙橀噺銆傜敓鍛藉懆鏈熶负浠庣▼搴忚繍琛屽埌绋嬪簭閫鍑猴紝鍗宠疮绌挎暣涓繍琛屾椂闂淬傛棤鏄惧紡鍒濆鍖栨椂榛樿鍒濆鍖栧间负0銆2 闈...
  • c璇█涓潤鎬佸彉閲忎笌鍔ㄦ佸彉閲忕殑涓嶅悓?
    绛旓細鍔ㄦ佸彉閲忓湪姣忔鍑芥暟璋冪敤涔嬪悗浼氭妸鍙橀噺閿姣侊紝涓嬫璋冪敤鏃跺氨鏄彟涓涓簡銆傞潤鎬佺殑涓嶄細閿姣侊紝涓嬫璋冪敤鏃惰繕鏄偅涓銆傛瘮濡傦細void a(){ static int i=0;i++;} void b(){ int i=0;i++;} 杩欎釜浣犺皟鐢ㄤ袱娆 i灏卞彉鎴2浜 涓嶇浣犺皟鐢ㄥ灏戞b i閮芥槸1....
  • C璇█涓潤鎬佸彉閲忎笌鍔ㄦ佸彉閲忕殑瀹氫箟涓鍖哄埆
    绛旓細鍔ㄦ佸彉閲忓拰闈欐佸彉閲忓畾涔夊拰鍖哄埆濡備笅锛1銆佸畾涔変笂锛岄潤鎬佸彉閲忔瘮鍔ㄦ佸彉閲忓涓涓叧閿瓧static锛屾瘮濡傦細鍔ㄦ佸彉閲忥細int i;闈欐佸彉閲忥細static int i;2銆佸姩鎬佸彉閲忓湪瀛愮▼搴忎腑锛屾瘡娆¤皟鐢ㄦ椂閮戒細浠庨浂寮濮嬶紝涓嶄細淇濈暀鍘熸湁鏁版嵁锛岄潤鎬佸彉閲忚皟鐢ㄦ椂鍘熸湁鍊间笉浼氬彂鐢熸敼鍙橈紝姣斿锛歮ain(){ int i;for(i=0;i<5;i++)fun();/...
  • 鍦C璇█涓潤鎬佸彉閲忓拰鍔ㄦ佸彉閲忕殑鍖哄埆,搴旇濡備綍鐞嗚В
    绛旓細闈欐佸彉閲忓氨鏄▼搴忓湪鎵ц鍓嶅氨宸茬粡鍙互纭畾鐨勫湴鍧鐨勫彉閲忋傛櫘閫氬彉閲忓垯鏄湪绋嬪簭鎵ц鍚庢墠鍒嗛厤鐨勫湴鍧鐨勫彉閲銆傛墍浠ラ潤鎬佸彉閲忓鏁翠釜绋嬪簭閮芥槸鍙鐨勶紝鏅氬彉閲忓彧鑳借缁欏叾鍒嗛厤鍦板潃鐨勬ā鍧椾娇鐢紝瓒呭嚭杩欎釜妯″潡鏅氬彉閲忕殑鐢熷懡鍛ㄦ湡缁撴潫銆
  • 鍏充簬c璇█auto鍙橀噺鍜宻tatic鍙橀噺鍖哄埆
    绛旓細鑷姩鍙橀噺(auto鍙橀噺)鍜岄潤鎬佸彉閲(static鍙橀噺)涓昏鏈変互涓嬪嚑鐐瑰尯鍒細1銆乻tatic鍙橀噺瀛樻斁鍦ㄩ潤鎬佸瓨鍌ㄥ尯锛屽湪绋嬪簭鏁翠釜杩愯鏈熼棿閮戒笉閲婃斁锛涜宎uto鍙橀噺瀛樻斁鍦ㄥ姩鎬佸瓨鍌ㄥ尯锛岄殢鐫鐢熷懡鍛ㄦ湡鐨勭粨鏉熻岀珛鍗抽噴鏀俱2銆乻tatic鍙橀噺鍙祴鍊间竴娆★紝浠ュ悗灏变笉鐢ㄨ祴鍊硷紱鑰宎uto鍙橀噺鍦ㄥ嚱鏁版瘡璋冪敤涓娆¢兘瑕佽祴鍒濆笺3銆佸鏋滅敤鎴蜂笉瀵箂tatic鍙橀噺璧嬪垵鍊...
  • c璇█涓浠涔堟槸闈欐佸彉閲,浠涔堟槸鍔ㄦ佸彉閲?
    绛旓細闈欐佸彉閲鍦ㄤ粬鐨勪綔鐢ㄥ煙閲屼竴鐩村瓨鍦紝鑰屽姩鎬佸彉閲忔槸鍦ㄧ▼搴忔墽琛岃繃绋嬩腑寤虹珛锛岄殢鍑芥暟鐨勮皟鐢ㄩ渶瑕佸姩鎬佺殑鍒嗛厤瀛樺偍绌洪棿锛岃皟鐢ㄧ粨鏉熼噴鏀炬帀鐨勩
  • C璇█涓彉閲忕殑瀛樺偍绫诲瀷鏈夊摢鍑犵,瀛樺偍鏂瑰紡鍝嚑绉?璋㈠柦
    绛旓細鍦–璇█涓紝瀵瑰彉閲忕殑瀛樺偍绫诲瀷璇存槑鏈変互涓嬪洓绉嶏細1銆乤uto 鑷姩鍙橀噺 2銆乺egister 瀵勫瓨鍣ㄥ彉閲 3銆乪xtern 澶栭儴鍙橀噺 4銆乻tatic 闈欐佸彉閲 鎵璋撳瓨鍌ㄧ被鍨嬫槸鎸囧彉閲忓崰鐢ㄥ唴瀛樼┖闂寸殑鏂瑰紡锛屼篃绉颁负瀛樺偍鏂瑰紡銆傚彉閲忕殑瀛樺偍鏂瑰紡鍙垎涓衡滈潤鎬佸瓨鍌ㄢ濆拰鈥滃姩鎬佸瓨鍌ㄢ濅袱绉嶃1銆侀潤鎬佸瓨鍌ㄥ彉閲忛氬父鏄湪鍙橀噺瀹氫箟鏃跺氨鍦ㄥ瓨鍌ㄥ崟鍏冨苟...
  • 绠杩闈欐灞閮鍙橀噺鍜鑷姩鍙橀噺鐨勫尯鍒,骞朵妇渚嬭鏄 C璇█鐨 鎬ユ眰绛旀
    绛旓細鐢熷懡鍛ㄦ湡涓嶅悓锛1銆佸姩鎬佸彉閲忕敓鍛藉懆鏈熶粎涓哄嚱鏁版墽琛屾椂闂村懆鏈燂紝璇ュ嚱鏁拌皟鐢ㄧ粨鏉燂紝鍙橀噺閿姣侊紱2銆闈欐佸彉閲鐢熷懡鍛ㄦ湡寤堕暱鍒版暣涓▼搴忔墽琛岀粨鏉燂紙涓嶆槸璇ュ嚱鏁拌皟鐢ㄧ粨鏉燂紝鏄痬ain鍑芥暟缁撴潫锛夛紝鏈鍑芥暟璋冪敤缁撴潫锛屽彉閲忎笉閿姣侊紝鍐嶆璋冪敤璇ュ嚱鏁 璇ュ彉閲忎繚鐣欎笂涓娆$殑鍊笺
  • 鍙橀噺鐨勯潤鎬瀛樺偍涓庡姩鎬瀛樺偍
    绛旓細棣栧厛锛岄潤鎬佸瓨鍌ㄤ笌鍔ㄦ佸瓨鍌ㄩ兘鏄彉閲忓湪鍐呭瓨涓殑瀛樺偍鏂瑰紡銆侰璇█涓彉閲忓垎涓哄眬閮ㄥ彉閲忥紙auto锛夈佸瘎瀛樺櫒鍙橀噺锛坮egister锛夈佸叏灞鍙橀噺锛坋xtern锛銆侀潤鎬佸彉閲锛坰tatic锛夈傚眬閮ㄥ彉閲忓拰瀵勫瓨鍣ㄥ彉閲忓湪鍐呭瓨涓互鍔ㄦ佸瓨鍌ㄧ殑鏂瑰紡瀛樺偍锛屽閮ㄥ彉閲忓拰闈欐佸彉閲忓湪鍐呭瓨涓互闈欐佸瓨鍌ㄧ殑鏂瑰紡瀛樺偍銆傦紙绗旇呮敞锛欳璇█涓嶅瓨鍦ㄧ湡姝f剰涔変笂鐨勨滃叏灞...
  • 扩展阅读:静态变量static会变吗 ... 静态纹和动态纹的区别 ... c语言静态变量的例子 ... 静态变量的正确使用 ... c语言extern的用法 ... c语言静态变量有哪些 ... c语言静态变量生存期 ... c#静态变量 ... java静态变量和动态变量 ...

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