当你第一次看到如下语句时,你脑子里想的是什么:
static void(*funcPtr[])()={TurnUpTemp,TurnDownTemp,PourCandy};
这样的语句称为复杂数据定义,因为它们涉及的不仅仅是简单的数据类型说明符和变量名。让我们使用这个定义,删除存储说明符和括号之间出现的初始值设定项代码,然后只关注剩下的内容:
void(*funcPtr[3])();
问题是:这个定义有什么作用?或者,你如何表述此定义?事实上Arduino C有一种叫左右规则的定义操作方法,可以非常简单地解决上面的问题。左右规则表示首先在定义中定位标识符(例如,funcPtr),然后按从右到左的方式从定义中螺旋展出各个符号来。图9-7展示了定义操作要执行的步骤。步骤1表示查找数据项的名称。在图9-7中,你可以看到名称是功能性的。到目前为止,你可以说:“funcPtr是一个……”
现在,看看标识符的右边。在数据定义中看到的是“[3]”。因为你知道括号“[” 引入某种数组,任何数字都指定了数组的大小,你现在可以说:“funcPtr是一个有3个元素的数组……”
要了解数组类型是什么,你必须查看标识符的左侧。如图9-7所示,第2步将你移至左侧,你会发现一个星号。因为数据定义中的星号与指针一起使用,所以现在可以说:“funcPtr是一个有3个指向函数指针组成的数组。”(www.xing528.com)
图9-7 螺旋步骤图
要确定指针指向什么,你需要再次向右移动并查看下一个指针指向什么数据定义中的属性。实际上看到的是右括号。然而,这可以用于对标识符周围的属性进行分组。因为括号内的所有内容都是已“用完”,必须向右移动才能找到下一个属性。如图9-7步骤3所示,你会看到一组括号。在数据定义中,括号用于标记函数的签名。
因此,你现在可以说:“funcPtr是一个有3个指向函数的指针组成的数组……”
但是,所有函数定义都必须有一个类型说明符,告诉函数返回什么。要确定函数返回什么,我们需要在数据定义中向左移动,如图9-7所示步骤4。现在你可以说:“funcPtr是一个无返回数据的3个指向函数指针的数组。”
如果在第4步之后回过头来查看数据定义中的右侧,你会发现没有其他内容为该数据定义保留的属性。因此,你可以告诉你的朋友:“funcPtr是有3个指向返回void的函数指针的数组。”虽然这项技能看起来不太好,未能给你留下深刻的印象,但是在你阅读其他人的复杂代码时,或许它能给你提供一些帮助。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。