在之前的學(xué)習(xí)中,我們簡單介紹了Arduino的數(shù)據(jù)類型,下面一起來學(xué)習(xí)Arduino的變量和常量。首先是變量,在開始了解變量之前,理解變量的范圍是非常重要的。
什么是變量范圍?Variable Scope
Arduino使用的 C 語言變量中有一個(gè)名為scope的屬性。scope 也就是范圍是程序的一部分,變量又分為三種類型,分別是:
- 在函數(shù)或塊內(nèi)部的變量,稱為局部變量。
- 在函數(shù)參數(shù)中定義的變量,稱為形參。
- 在所有函數(shù)之外定義的變量,它被稱為全局變量。
局部變量 Local Variables
在函數(shù)或區(qū)塊中聲明的變量是局部變量。它們只能由位于函數(shù)或代碼塊內(nèi)的語句使用,局部變量不會(huì)在函數(shù)或代碼塊之外起作用。 下面是使用局部變量的示例 :
Void setup () { } Void loop () { int x , y ; int z ; //聲明局部變量 x = 0; y = 0; //實(shí)際參數(shù) z = 10; }
全局變量 Global Variables
全局變量在所有函數(shù)之外進(jìn)行定義,通常在程序的頂部區(qū)域。全局變量將在程序的整個(gè)生命周期中發(fā)揮作用。全局變量一旦定義,任何函數(shù)都可以訪問和使用它,也就是說,一個(gè)全局變量在聲明之后在整個(gè)程序中都可以使用。下面的示例使用了全局變量和局部變量 :
Int T , S ; float c = 0 ; //聲明全局變量; Void setup () { } Void loop () { int x , y ; int z ; //聲明局部變量 x = 0; y = 0; //實(shí)際參數(shù) z = 10; }
形式參數(shù) formal parameter
在函數(shù)定義中出現(xiàn)的參數(shù)可以看做是一個(gè)占位符,它沒有數(shù)據(jù),只能等到函數(shù)被調(diào)用時(shí)接收傳遞進(jìn)來的數(shù)據(jù),所以稱為形式參數(shù),簡稱形參。 形參變量只有在函數(shù)被調(diào)用時(shí)才會(huì)分配內(nèi)存,調(diào)用結(jié)束后,立刻釋放內(nèi)存,所以形參變量只有在函數(shù)內(nèi)部有效,不能在函數(shù)外部使用。
實(shí)際參數(shù) actual parameter
實(shí)參本身不屬于變量范疇,它是函數(shù)被調(diào)用時(shí)給出的參數(shù)包含了實(shí)實(shí)在在的數(shù)據(jù),會(huì)被函數(shù)內(nèi)部的代碼使用,所以稱為實(shí)際參數(shù),簡稱實(shí)參。實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的數(shù)據(jù),在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參,所以應(yīng)該提前用賦值、輸入等辦法使實(shí)參獲得確定值。
形參和實(shí)參的聯(lián)系
實(shí)參和形參在數(shù)量上、類型上、順序上必須嚴(yán)格一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。當(dāng)然,如果能夠進(jìn)行自動(dòng)類型轉(zhuǎn)換,或者進(jìn)行了強(qiáng)制類型轉(zhuǎn)換,那么實(shí)參類型也可以不同于形參類型。
函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳遞是單向的,只能把實(shí)參的值傳遞給形參,而不能把形參的值反向地傳遞給實(shí)參;換句話說,一旦完成數(shù)據(jù)的傳遞,實(shí)參和形參就再也沒有瓜葛了,所以,在函數(shù)調(diào)用過程中,形參的值發(fā)生改變并不會(huì)影響實(shí)參。
請(qǐng)看下面的例子:
#include <stdio.h> /* *計(jì)算從m加到n的值 */ int sum(int m, int n) { int i; for (i = m+1; i <= n; ++i) { m += i; } return m; } int main() { int a, b, total; printf("Input two numbers: "); scanf("%d %d", &a, &b); total = sum(a, b); printf("a=%d, b=%d\n", a, b); printf("total=%d\n", total); return 0; }
在這段代碼中,函數(shù)定義處的 m、n 是形參,函數(shù)調(diào)用處的 a、b 是實(shí)參。通過 scanf() 可以讀取用戶輸入的數(shù)據(jù),并賦值給 a、b,在調(diào)用 sum() 函數(shù)時(shí),這份數(shù)據(jù)會(huì)傳遞給形參 m、n。