鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ 7.1 C 語言變量的作用域
8.3 C 語言函數(shù)的形參和實(shí)參
12.2 C 語言指針變量的聲明
12.5 ?C 語言字符數(shù)組和字符指針
7.3 單片機(jī) LED 點(diǎn)陣的介紹
11.5 UART 串口通信的基本應(yīng)用
9.9 單片機(jī)蜂鳴器控制程序和驅(qū)動(dòng)電路
10. 單片機(jī)實(shí)例練習(xí)與經(jīng)驗(yàn)積累
10.3 單片機(jī)交通燈控制程序和設(shè)計(jì)原理
9.8 實(shí)用的 28BYJ-48 步進(jìn)電機(jī)控制程序
8.2 C 語言函數(shù)的調(diào)用
12.4 C 語言指向數(shù)組元素的指針
7.1 C 語言變量的作用域
11.2 RS232 通信接口
12.7 1602 液晶的讀寫時(shí)序介紹
7.2 C 語言變量的存儲(chǔ)類別
8. C 語言函數(shù)進(jìn)階與單片機(jī)按鍵
10.4 51單片機(jī) RAM 區(qū)域的劃分
12.1 C 語言變量的地址
11. UART 串口通信
7. 變量進(jìn)階與點(diǎn)陣 LED
8.4 單片機(jī)按鍵介紹
9.3 電機(jī)的分類
9.1 單片機(jī) IO 口的結(jié)構(gòu)
單片機(jī)通信實(shí)例與 ASCII 碼
8.1 單片機(jī)最小系統(tǒng)解析(電源、晶振和復(fù)位電路)
9.2 單片機(jī)上下拉電阻
11.4 單片機(jī) IO 口模擬 UART 串口通信
9.5 讓 28BYJ-48 步進(jìn)電機(jī)轉(zhuǎn)起來
9.7 28BYJ-48 步進(jìn)電機(jī)控制程序基礎(chǔ)
12.8 1602 液晶指令介紹
12.3 C 語言指針的簡(jiǎn)單示例
8.7 單片機(jī)矩陣按鍵的掃描
7.4 單片機(jī) LED 點(diǎn)陣的圖形顯示
8.6 單片機(jī)按鍵消抖程序
10.2 單片機(jī)中 PWM 的原理與控制程序
7.6 單片機(jī) LED 點(diǎn)陣的橫向移動(dòng)(動(dòng)態(tài)顯示)
11.3 USB 轉(zhuǎn)串口通信
12.9 1602 液晶簡(jiǎn)單顯示程序
9.4 28BYJ-48 步進(jìn)電機(jī)原理
8.5 ?單片機(jī)獨(dú)立按鍵掃描程序
12. C 語言指針基礎(chǔ)與1602液晶的初步認(rèn)識(shí)
9. 單片機(jī)中的步進(jìn)電機(jī)與蜂鳴器
10.1 單片機(jī)數(shù)字秒表程序
7.5 單片機(jī) LED 點(diǎn)陣的縱向移動(dòng)(動(dòng)態(tài)顯示)
8.8 單片機(jī)簡(jiǎn)易加法計(jì)算器程序
11.1 單片機(jī)串行通信介紹
10.5 單片機(jī)長(zhǎng)短按鍵的應(yīng)用
12.6 1602 液晶介紹(電路和引腳圖)
9.6 28BYJ-48 步進(jìn)電機(jī)轉(zhuǎn)動(dòng)精度與深入分析

7.1 C 語言變量的作用域

所謂的作用域就是指變量起作用的范圍,也是變量的有效范圍。變量按他的作用域可以分為局部變量和全局變量。

局部變量

在一個(gè)函數(shù)內(nèi)部聲明的變量是內(nèi)部變量,它只在本函數(shù)內(nèi)有效,在本函數(shù)以外是不能使用的,這樣的變量就是局部變量。此外,函數(shù)的形參也是局部變量,形參我們會(huì)在后面再詳細(xì)解釋。

比如上節(jié)課程序中定義的 unsigned long sec 這個(gè)變量,它是定義在 main 函數(shù)內(nèi)部的,所以只能由 main 函數(shù)使用,中斷函數(shù)就不能使用這個(gè)變量。同理,我們?nèi)绻谥袛嗪瘮?shù)內(nèi)部定義的變量,在 main 函數(shù)中也是不能使用的。

全局變量

在函數(shù)外聲明的變量就是全局變量。一個(gè)源程序文件可以包含一個(gè)或者多個(gè)函數(shù),全局變量的作用范圍是從它開始聲明的位置一直到程序結(jié)束。

比如上節(jié)課程序中定義的 unsigned char LedBuff[6]這個(gè)數(shù)組,它的作用域就是從開始定義的位置一直到程序結(jié)束,不管是 main 函數(shù),還是中斷函數(shù) InterruptTimer0,都可以直接使用這個(gè)數(shù)組。

局部變量只有在聲明它的函數(shù)范圍內(nèi)可以使用,而全局變量可以被作用域內(nèi)的所有的函數(shù)直接使用。所以在一個(gè)函數(shù)內(nèi)既可以使用本函數(shù)內(nèi)聲明的局部變量,也可以使用全局變量。

從編程規(guī)范上講,一個(gè)程序文件內(nèi)所有的全局變量都應(yīng)定義在文件的開頭部分,在文件中所有函數(shù)之前。

由于 C 語言函數(shù)只有一個(gè)返回值,但是我們卻經(jīng)常會(huì)希望一個(gè)函數(shù)可以提供或影響多個(gè)結(jié)果值,這時(shí)我們就可以利用全局變量來實(shí)現(xiàn)。但是考慮到全局變量的一些特征,應(yīng)該限制全局變量的使用,過多使用全局變量也會(huì)帶來一些問題。

1) 全局變量可以被作用域內(nèi)所有的函數(shù)直接引用,可以增加函數(shù)間數(shù)據(jù)聯(lián)系的途徑,但同時(shí)加強(qiáng)了函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,使這些函數(shù)的獨(dú)立性降低,對(duì)其中任何一個(gè)函數(shù)的修改都可能會(huì)影響到其它函數(shù)的執(zhí)行結(jié)果,函數(shù)之間過于緊密的聯(lián)系不利于程序的維護(hù)的。

2) 全局變量的應(yīng)用會(huì)降低函數(shù)的通用性,函數(shù)在執(zhí)行的時(shí)候過多依賴于全局變量,不利于函數(shù)的重復(fù)利用。目前我們編寫的程序還都比較簡(jiǎn)單,就一個(gè) .c 文件,但以后我們要學(xué)到一個(gè)程序中有多個(gè) .c 文件,當(dāng)一個(gè)函數(shù)被另外一個(gè) .c 文件調(diào)用的時(shí)候,必須將這個(gè)全局變量的變量值一起移植,而全局變量不只被一個(gè)函數(shù)調(diào)用,這樣會(huì)引起一些不可預(yù)見的后果。

3) 過多使用全局變量會(huì)降低程序的清晰度,使程序的可讀性下降。在各個(gè)函數(shù)執(zhí)行的時(shí)候都可能改變?nèi)肿兞恐?,往往難以清楚的判斷出每個(gè)時(shí)刻各個(gè)全局變量的值。

4) 定義全局變量會(huì)永久占用單片機(jī)的內(nèi)存單元,而局部變量只有進(jìn)入定義局部變量的函數(shù)時(shí)才會(huì)占用內(nèi)存單元,函數(shù)退出后會(huì)自動(dòng)釋放所占用的內(nèi)存。所以大量的全局變量會(huì)額外增加內(nèi)存消耗。

綜上所述之原因,在編程規(guī)范上有一條原則,就是盡量減少全局變量的使用,能用局部變量代替的就不用全局變量。

還有一種特殊情況,大家在看別人程序的時(shí)候請(qǐng)注意,C 語言是允許局部變量和全局變量同名的,他們定義后在內(nèi)存中占有不同的內(nèi)存單元。如果在同一源文件中,全局變量和局部變量同名,在局部變量作用域范圍內(nèi),只有局部變量有效,全局變量不起作用,也就是說局部變量具有更高優(yōu)先級(jí)。但是從編程規(guī)范上講,是要避免全局變量與局部變量重名的,從而避免不必要的誤解和誤操作。