你能修改代码清单9-2中的代码以使用指针吗?当然,但这需要更多的思考。这个修改后的代码如清单9-3所示。
代码清单9-3.Modified Two-Dimensional Array Program to Use Pointers
首先要注意的是现在有两个char指针变量,ptr和base。在代码中,ptr用于在角色数组中行进,而base用于跟踪数组在内存中起始位置。回想一下上一个程序,当你在没有重置指针后,将显示随机垃圾数据。在清单9-3中使用了基指针防止同样的问题。
base=days[0];
是必需的,因为这是秩2数组。一维数组解析为指向char的指针,因此数组的名称是数组的左值。但是,对于二维数组,你有一个指向数组,而不是指向指针的指针。由此,需要指针初始化使用days[0]。
同理,如果有秩3数组,则需要在指针初始化中使用:array[0][0]。你可以使用强制转换语法,但这似乎是一种人为的方式。在由变量i控制的for循环中,语句:
ptr=base+(i*CHARSINDAY);初始化ptr以指向下一个要显示的数组元素。查看图9-4,days[][]数组从内存地址258开始。因为你将base初始化为指向数组第一个元素的起始地址,所以base等于258。因此,在第一次通过循环时,表达式解析为:
ptr=base+(i*CHARSINDAY);
ptr=258+(0*10);(www.xing528.com)
ptr=258+0;
ptr=258;
这正是我们想要的。在第二次通过循环时,ptr解析为:
ptr=base+(i*CHARSINDAY);
ptr=258+(1*10);
ptr=258+10;
ptr=268;
这与图9-4中显示的值一致。这应该能够说明清楚了,每次通过循环都会导致ptr的左值比之前的值大10字节,这与预期完全一致。请注意,基本指针从未更改。这是因为所有的计算都是从数组的开头开始索引的。
在由变量j控制的for循环中,语句:
Serial.print(*ptr++);//Show one char只会导致代码遍历数组,显示每个字符,直到读取空终止字符。当ptr增加到null终止字符时,for循环的表达式2终止(循环代码碰到null字符后逻辑运算结果为假),循环结束。显示行尾字符,以便下一行重新换行显示。然后,程序变量i加1,并执行下一次循环的代码。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。