for(p=a;p<(a+10);p++)
cout<<*p<<″ ″; //p先后指向a[0]~a[9]
cout<<endl;
return 0;
}
运行情况与前相同。请仔细分析p值的变化和*p的值。
对3种方法的比较:
方法(1)和(2)的执行效率是相同的。第(3)种方法比方法(1)、(2)快。这种方法能提高执行效率。
用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法都不太直观,难以很快地判断出当前处理的是哪一个元素。
在用指针变量指向数组元素时要注意: 指针变量p可以指向有效的数组元素,实际上也可以指向数组以后的内存单元。如果有
int a[10],*p=a; //指针变量p的初值为&a[0]
cout<<*(p+10); //要输出a[10]的值
在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素。
指向数组元素的指针的运算比较灵活,务必小心谨慎。下面举几个例子:
如果先使p指向数组a的首元素(即p=a),则:
(1) p++(或p+=1)。使p指向下一元素,即a[1]。如果用*p,得到下一个元素a[1]的值
(2) *p++。由于++和*同优先级,结合方向为自右而左,因此它等价于*(p++)。作用是: 先得到p指向的变量的值(即*p),然后再使p的值加1。例6.5(3)程序中最后一个for语句:
for(p=a;p<a+10;p++)
cout<<*p;
可以改写为
for(p=a;p<a+10;)
cout<<*p++;
(3) *(p++)与*(++p)作用不同。前者是先取*p值,然后使p加1。后者是先使p加1,再取*p。若p的初值为a(即&a[0]),输出*(p++)得到a[0]的值,而输出*(++p)则得到a[1]的值。
(4) (*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=3,则(a[0])++的值为4。注意: 是元素值加1,而不是指针值加1。
(5) 如果p当前指向a[i],则
*(p--) 先对p进行“*”运算,得到a[i],再使p减1,p指向a[i-1]。
*(++p) 先使p自加1,再作*运算,得到a[i+1]。
*(--p) 先使p自减1,再作*运算,得到a[i-1]。
将++和--运算符用于指向数组元素的指针变量十分有效,可以使指针变量自动向前或向后移动,指向下一个或上一个数组元素。例如,想输出a数组100个元素,可以用以下语句:
p=a; p=a;
while(p<a+100) 或 while(p<a+100)
cout<<*p++; {cout<<*p;
p++;}
在用*p++形式的运算时,很容易弄错,一定要十分小心,弄清楚先取p值还是先使p加1。
评论