在之前的学习中,我们简单介绍了Arduino的数据类型,下面一起来学习Arduino的变量和常量。首先是变量,在开始了解变量之前,理解变量的范围是非常重要的。
什么是变量范围?Variable Scope
Arduino使用的 C 语言变量中有一个名为scope的属性。scope 也就是范围是程序的一部分,变量又分为三种类型,分别是:
- 在函数或块内部的变量,称为局部变量。
- 在函数参数中定义的变量,称为形参。
- 在所有函数之外定义的变量,它被称为全局变量。
局部变量 Local Variables
在函数或区块中声明的变量是局部变量。它们只能由位于函数或代码块内的语句使用,局部变量不会在函数或代码块之外起作用。 下面是使用局部变量的示例 :
Void setup () { } Void loop () { int x , y ; int z ; //声明局部变量 x = 0; y = 0; //实际参数 z = 10; }
全局变量 Global Variables
全局变量在所有函数之外进行定义,通常在程序的顶部区域。全局变量将在程序的整个生命周期中发挥作用。全局变量一旦定义,任何函数都可以访问和使用它,也就是说,一个全局变量在声明之后在整个程序中都可以使用。下面的示例使用了全局变量和局部变量 :
Int T , S ; float c = 0 ; //声明全局变量; Void setup () { } Void loop () { int x , y ; int z ; //声明局部变量 x = 0; y = 0; //实际参数 z = 10; }
形式参数 formal parameter
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
实际参数 actual parameter
实参本身不属于变量范畴,它是函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
形参和实参的联系
实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
请看下面的例子:
#include <stdio.h> /* *计算从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; }
在这段代码中,函数定义处的 m、n 是形参,函数调用处的 a、b 是实参。通过 scanf() 可以读取用户输入的数据,并赋值给 a、b,在调用 sum() 函数时,这份数据会传递给形参 m、n。