认识Arduino与C语言的指针和指针数组 – Arduino 实验室 | 您所在的位置:网站首页 › arduino和c语言 › 认识Arduino与C语言的指针和指针数组 – Arduino 实验室 |
认识Arduino与C语言的指针和指针数组 2017年6月21日 admin 未分类 0 读者询问如何在Arduino中建立数个自定义函式,并且透过「函式指针数组」,在不使用if…else或switch…case等条件判断式的情况下,让程序依据变数的值,执行不同的自定义函式。 下文将先介绍Arduino与C程序语言的函式指针语法。 建立函式指针程序就像变数一样,函式(function)同样被暂存在某个內存内存块,可以透过指针(pointer)取用;指向函式的指针称为「函式指针(function pointer)」 底下的Arduino程序宣告了一个hello()自定义函式,并透过一个叫做‘f’的指针指向并执行它: 若在Arduino执行此程序,将能在序列端口监控视窗看见“hello world.”信息。 函式指针的语法函式指针的语法如下: 指针名称必须用代表「优先处理」的小括号包围,如果少了小括号,程序叙述的意义将大不相同: 上面的Arduino代码,若用C语言改写,将变成: #include // 宣告自訂函式 void hello() { printf("hello world.\n"); } // 宣告指向hello函式的函式指標 void (*f)() = hello; void main(void) { // 透過函式指標執行hello函式 (*f)(); } 函式指针的参数传递与传回值假如要透过指针参照具有输入参数和传回值的函式,例如,一个计算并传回两整数相加值的自定义函式“sum”: 函式指针的定义也要跟着修改: 完整的Arduino示例程序如下: // 宣告自訂函式 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语言程序的示例如下: #include 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); } 函式指针数组认识函式指针的语法之后,函式指针数组的语法也很容易理解。假设程序事先宣告了名叫fn0,fn1和fn3的函式,底下的叙述将透过自定义的“f”指针数组指向它们: 底下是Arduino版本的函式指针数组示例,上传代码之后,开启序列端口监控视窗,接着在序列端口监控视窗中输入0~2的数字,程序将执行对应的fn0~fn2函式。 // 宣告三個自訂函式 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程序语言的版本: #include 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"); } } 3,204 文章标题:认识Arduino与C语言的指针和指针数组 - Arduino 实验室 固定链接:https://arduino.nxez.com/2017/06/21/arduino-and-c-language-pointer-and-pointer-array.html arduinolevel2教程编程 |
CopyRight 2018-2019 实验室设备网 版权所有 |