例10.5输出数组中的全部元素。
假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:
(1) 下标法。
main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%D",a[i]);
}
(2) 通过数组名计算数组元素地址,找出元素的值。
main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%D",*(a+i));
}
(3) 用指针变量指向数组元素。
main()
{
int a[10];
int*p,i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(p=a;p<(a+10);p++)
printf("%D ",*p);
}
以上3个程序的运行情况均如下:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
对三种方法的比较:
(1) 例10.5的第(1)和(2)种方法执行效率是相同的。C编译系统是将a[i]转换为*(a+i)处理的。即先计算元素地址。因此用第(1)和(2)种方法找数组元素费时较多。
(2) 第(3)种方法比(1)(2)法快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率。
(3) 用下标法比较直观,能直接知道是第几个元素。例如,a[5]是数组中序号为5的元素(注意序号从0算起)。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。例如,例10.5第(3)种方法所用的程序,要仔细分析指针变量p的当前指向,才能判断当前输出的是第几个元素。
在使用指针变量时,有几个问题要注意:
(1) 指针变量可以实现使本身的值改变。例如,上述第(3)种方法是用指针变量p来指向元素,用p++使p的值不断改变,这是合法的。如果不用p而使a变化(例如,用a++)行不行呢?假如将上述(3)程序的最后两行改为
for(p=a;a<(p+10);a++)
printf("%D",*a);
是不行的。因为a是数组名,它是数组首地址,它的值在程序运行期间是固定不变的,是常量。a++是什么意思呢?这是无法实现的。
(2) 要注意指针变量的当前值。请看下面的程序。
假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:
(1) 下标法。
main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%D",a[i]);
}
(2) 通过数组名计算数组元素地址,找出元素的值。
main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%D",*(a+i));
}
(3) 用指针变量指向数组元素。
main()
{
int a[10];
int*p,i;
for(i=0;i<10;i++)
scanf("%D",&a[i]);
printf("\n");
for(p=a;p<(a+10);p++)
printf("%D ",*p);
}
以上3个程序的运行情况均如下:
1 2 3 4 5 6 7 8 9 0
1 2 3 4 5 6 7 8 9 0
对三种方法的比较:
(1) 例10.5的第(1)和(2)种方法执行效率是相同的。C编译系统是将a[i]转换为*(a+i)处理的。即先计算元素地址。因此用第(1)和(2)种方法找数组元素费时较多。
(2) 第(3)种方法比(1)(2)法快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率。
(3) 用下标法比较直观,能直接知道是第几个元素。例如,a[5]是数组中序号为5的元素(注意序号从0算起)。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。例如,例10.5第(3)种方法所用的程序,要仔细分析指针变量p的当前指向,才能判断当前输出的是第几个元素。
在使用指针变量时,有几个问题要注意:
(1) 指针变量可以实现使本身的值改变。例如,上述第(3)种方法是用指针变量p来指向元素,用p++使p的值不断改变,这是合法的。如果不用p而使a变化(例如,用a++)行不行呢?假如将上述(3)程序的最后两行改为
for(p=a;a<(p+10);a++)
printf("%D",*a);
是不行的。因为a是数组名,它是数组首地址,它的值在程序运行期间是固定不变的,是常量。a++是什么意思呢?这是无法实现的。
(2) 要注意指针变量的当前值。请看下面的程序。