(1)下标法
编写程序:
(2)指针法:
将上面程序第7行和第10行的a[i]改为"*(a+i)"。
(3)用指针变量指向数组元素
编写程序:
运行结果:
对3种方法的比较:
方法(1)和(2)的执行效率是相同的。C++编译系统是将a[i]转换为*(a+1)处理的,对每个a[i]都分别计算地址a+ixd,然后访问该元素。第(3)种方法比方法(1)、(2)快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种方法能提高执行效率。
用下标法比较直观,能直接知道是第几个元素。例如,a[5]是数组中序号为5的元素(注意序号从0算起)。用地址法或指针变量的方法都不太直观,难以很快地判断出当前处理的是哪一个元素。例如,对第(3)种方法,阅读者要仔细分析指针变量p的当前指向,才能判断当前输出的是第几个元素。
在用指针变量指向数组元素时要注意:指针变量p是被定义为指向整型的对象,它可以指向整型的数组元素,也可以指向数组以后的内存单元。如果有
int a[10],*p=a; //指针变量p的初值为&a[0]
cout<<*(p+10); //要输出a[10]的值
数组a最后一个有效的元素是a[9],现在要求输出a[10],但C++编译系统并不把它认作非法。系统按p+10xd计算出要访问单元的地址,这显然是a[9]后面一个单元的地址,然后输出这个单元中的内容。如果写成"cout<<a[10];"或"cout<<*(a+10);",情况也一样。这样做虽然是合法的(在编译时不出错),但应避免出现这样的情况,这会使程序得不到预期的结果。这种错误比较隐蔽,初学者往往难以发现。在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素。
指向数组元素的指针的运算比较灵活,务必小心谨慎。