/*在学习《C和指针》(pointers on C)时遇到的一些好的问题会记录下来:
以便自己学习和与大家交流;
*/
//*************************************************************************************
书的110页有一段代码“清除一个数组中的所有元素”觉得很经典,代码如下:
#define N_VALUES 5 //宏定义;
float value[N_VALUES];
float *vp;
for(vp=&value[0];vp<&values[N_VALUES];)//用地址作为比较的条件;
*vp++=0;
//***************************************************************************************
随后,课后练习给出了一个问题:int array[ARRAY_SIZE];
int *pi;
for (pi = &array[0];pi < &array[ARRAY_SIZE];)
*++pi = 0;
这个循环的错误在哪呢?
//******************************************************************************************
问题有二:
1.for中循环判断语句:pi<&array[ARRAY_SIZE];
在数组中的ARRAY_SIZE 是表示数组中数据的个数;
比如:array[5]是表示array数组中的数据个数是5个 ,从array[0]到array[4];
明显pi<array[5]已经越界;
改为:pi<&array[ARRAY_SIZE-1];
2.*++pi=0;
*++pi这个表达式的含义:++的优先级高于*,所以先给pi加1,然后将结果 拷贝,最后再对拷贝的值进行间接访问;
所以,当pi从a[0]开始时,实际上a[0]并未清0;而是从a[1]开始的;
此外,比较一下*pi++;
同理,++的优先级高,所以++先将pi的值拷贝,然后再将pi加1,最后*对++拷贝的值(就是pi加1之前的值)进行间接访问;
//************************************************************************************************************
这两个表达式及上述循环在数组操作中使用频率比较高,也比较实用,要好好理解!