认识Arduino与C语言的指针和指针数组–Arduino实验室
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
认识Arduino与C语言的指针和指针数组–Arduino实验室
读者询问如何在Arduino中建立数个自定义函式,并且透过“函式指针数组”,在不使用if…else或switch…case等条件判断式的情况下,让程序依据变数的值,执行不同的自定义函式。
下文将先介绍Arduino与C程序语言的函式指针语法。
建立函式指针程序
就像变数一样,函式(function)同样被暂存在某个内存内存块,可以透过指针(pointer)取用;指向函式的指针称为“函式指针(function pointer)”
底下的Arduino程序宣告了一个hello()自定义函式,并透过一个叫做‘f’的指针指向并执行它:
若在Arduino执行此程序,将能在序列端口监控视窗看见“hello world.”信息。
函式指针的语法
函式指针的语法如下:
指针名称必须用代表“优先处理”的小括号包围,如果少了小括号,程序叙述的意义将大不相同:
上面的Arduino 代码,若用C 语言改写,将变成:
1
2 3 4 5 6 7 8 9 10 11 12 13 14
15 #include <stdio .h> // 宣告自订函式 void hello() { printf("hello world.\n"); } // 宣告指向hello 函式的函式指标 void (*f)() = hello; void main(void) { // 透过函式指标执行hello 函式 (*f)(); } </stdio> 函式指针的参数传递与传回值
假如要透过指针参照具有输入参数和传回值的函式,例如,一个计算并传回两整数相加值的自定义函式“sum”:
函式指针的定义也要跟着修改:
完整的Arduino 示例程序如下:
1 2 3 4 5 6 7 // 宣告自订函式
int sum(int x, int y) {
return x + y;
}
// 宣告具有两个参数以及整数传回值的函式指标
int (*f)(int x, int y) = sum;
void setup() {
8 9 10 11 12 13 14 15 16 17 18 19 20
21
22
Serial.begin(9600);
// 执行函式指标并传递两个参数
int val = (*f)(8, 4);
// 将在序列埠监控视窗显示"Ans: 12"
Serial.print("Ans: ");
Serial.println(val);
}
void loop() {
// 这里没有程式
}
相同功能的C 语言程序的示例如下:
1
2 3 4 5 6 7 8 9 10 11 12 13
14
#include <stdio .h> int sum(int x, int y) { return x + y; } int (*f)(int x, int y) = sum; void main(void) { int val = (*f)(8, 4); printf("Ans: %d\n", val); } </stdio> 函式指针数组
认识函式指针的语法之后,函式指针数组的语法也很容易理解。
假设程序事先宣告了名叫fn0,fn1和fn3的函式,底下的叙述将透过自定义的“f”指针数组指向它们:
底下是Arduino 版本的函式指针数组示例,上传代码之后,开启
序列端口监控视窗,接着在序列端口监控视窗中输入0~2的数字,程序将执行对应的fn0~fn2函式。
1 // 宣告三个自订函式
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33
34
35
void fn0() {
Serial.println("Hello from fn0.");
}
void fn1() {
Serial.println("Hello from fn1.");
}
void fn2() {
Serial.println("Hello from fn2.");
}
// 建立函式阵列指标
void (*f[3]) () = {fn0,fn1,fn2};
void setup() {
Serial.begin(9600);
Serial.println("Please input number 0~2:");
}
void loop() {
if( Serial.available() ) {
// 读取序列输入值,并转换成整数。
byte val = Serial.read() - 48;
// 确认输入值介于0和2之间
if (val >= 0 && val < = 2) {
// 将val 当作阵列索引,执行对应的函式。
(*f[val])();
} else {
// 若输入值超过指定范围,则显示“Wrong number!”(错误数字!)
Serial.println("Wrong number!");
}
}
}
底下是C 程序语言的版本:
1 2 3 4 5 6 7 8 9 #include <stdio .h>
void fn0() {
printf("Hello from fn0.\n");
}
void fn1() {
printf("Hello from fn1.\n");
}
void fn2() {
printf("Hello from fn2.\n");
10 11 12 13 14 15 16 17 18 19 20 21 22 23
24
25
26
27
28
29
}
void (*f[3]) () = {fn0,fn1,fn2}; void main(void) {
int val;
printf("\nPlease input number 0~2:"); // 读取输入值
scanf("%d",&val);
if(val>=0 && val< =2) {
(*f[val])();
} else {
printf("Wrong number!\n"); }
}。