打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
认识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
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 宣告自订函式
int sum(int x, int y) {
  return x + y;
}
// 宣告具有两个参数以及整数传回值的函式指标
int (*f)(int x, int y) = sum;
void setup() {
  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
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio .h>
void fn0() {
  printf("Hello from fn0.\n");
}
void fn1() {
  printf("Hello from fn1.\n");
}
void fn2() {
  printf("Hello from fn2.\n");
}
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");
  }
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
write() – 太极创客
Arduino和非Arduino板串口通信教程
Arduino 语法
Arduino 入门到精通 舵机控制
Arduino示波器(一)
Arduino串口的使用——与计算机交流
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服