观察一个循环,它用来清除一个数组中所有的元素。
#define N_VALUES 5 float values[N_VALUES]; float *vp; for(vp=&values[0];vp<&values[N_VALUES];) *vp++=0;
for语句使用了一个关系测试来决定是否结束循环,这个测试是合法的,因为vp和指针常量都指向同一数据中的元素(事实上,这个指针常量所指向的是数组最后一个元素后面 的那个内存位置)使用!=i代替<也是可行的
现在考虑下面这个循环:
for(vp=&values[N_VALUES];vp>&values[0];) *--vp=0;
它和前面那个循环所执行的任务g相同,但数组元素将以相反的次序清除。
注意:有人可能会反对像*--vp这种写法,认为可读性差,,写下了下面的写法:
for(vp=&values[N_VALUES-1];vp>=values[0];) *vp=0;
警告:在数组第一个元素被清除之后,vp的值还将减去1,而接下去的一次比较运算是用于结束循环的。
但是比较表达式vp>=&values[0]的值是未定义的,因为vp移到了数组的边界之外。标准允许指向数组元素的指针与指向数组最后一个n元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较。
时间: 2024-10-18 05:52:15