03-02、內(nèi)部全局變量和外部全局變量以及extern和static關(guān)鍵字

main.c
#include <stdio.h>
#include "zs.h"

/*
 全局變量分為兩種:
 1.外部全局變量, 默認(rèn)情況下所有的全局變量都是外部全局變量
什么事外部全局變量? 可以被其它文件訪問(wèn)的全局變量我們稱之為外部全局變量
 2.內(nèi)部全局變量, 只要給全局變量加上static關(guān)鍵字就是內(nèi)部全局變量
什么是內(nèi)部全局變量? 只能被當(dāng)前文件訪問(wèn)的全局變量我們稱之為內(nèi)部全局變量

 外部全局變量有一個(gè)特點(diǎn):
可以定義同名的外部全局變量
多個(gè)同名的外部全局變量指向同一塊存儲(chǔ)空間

 內(nèi)部全局變量有一個(gè)特點(diǎn)
也可以定義多個(gè)同名的內(nèi)部全局變量
多個(gè)同名的全局變量如果不在同一個(gè)文件中, 那么指向不同的存儲(chǔ)空間


 為了提高數(shù)據(jù)的安全性, 不讓別人在其它文件中修改我們的全局變量, C語(yǔ)言提供了另外一個(gè)用于修改全局變量的關(guān)鍵字, static
 只要用static修改的全局變量就是內(nèi)部全局變量, 只能在當(dāng)前文件中使用
 這樣就可以提高我們?nèi)肿兞康陌踩?
 如果多個(gè)文件中存在同名的內(nèi)部全局變量, 相互不會(huì)影響
 如果既有外部全局變量也有內(nèi)部全局變量, 那么會(huì)優(yōu)先訪問(wèn)內(nèi)部全局變量


 extern:
用于聲明一個(gè)外部全局變量
聲明只需要在使用變量之前聲明就可以了
 static:
用于定義一個(gè)內(nèi)部全局變量
 聲明和定義的區(qū)別:
聲明不會(huì)開辟存儲(chǔ)空間
定義會(huì)開辟存儲(chǔ)空間
 */

//int num; // 外部全局變量

static int num; // 內(nèi)部全局變量 998

int main(int argc, const char * argv[]) {
num = 998;
test();
printf("mian.c = num = %i\n", num);
return 0;
}
zs.h
void test();
zs.c
#include "zs.h"

/*
int num; // 由于Xcode升級(jí)之后導(dǎo)致的, 在Xcode6以前是可以的
如果直接在zs.c當(dāng)中定義外部全局變量num, 那么我們說(shuō)過(guò)同名的外部全局變量指向同一塊存儲(chǔ)空間,
 那么如果在多個(gè)文件中有同名的外部全局變量, 可能導(dǎo)致A文件的數(shù)據(jù)被B文件不小心修改了
 降低了數(shù)據(jù)的封裝性, 提高了發(fā)生錯(cuò)誤的概率
*/
//int num;

// extern關(guān)鍵字用來(lái)修飾全局變量, 代表聲明一個(gè)全局變量
// 注意: 聲明全局變量和聲明函數(shù)一樣, 僅僅是告訴系統(tǒng)我們有這個(gè)全局變量, 但并不會(huì)真在的開辟存儲(chǔ)空間
//extern int num;

//static int num; // 0  666

//int num; // 0 666


void test()
{
extern int num;
printf("zs.c = num = %i\n", num); // 0
num = 666;
}
int num;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容