【题目描述】
读入一些整数,逆序输出到一行中,数中间用空格隔开。已知整数不超过100个。
【样例输入】
94 95 27
【样例输出】
27 95 94
【题目来源】
刘汝佳《算法竞赛入门经典 第2版》程序3-1 逆序输出
【解析】
原书代码:
#include<stdio.h>
#define maxn 105
int a[maxn];
int main(){int x, n = 0;while(scanf("%d", &x) == 1)a[n++] = x;for(int i = n-1; i >= 1; i--)printf("%d ", a[i]);printf("%d\n", a[0]);return 0;
}
代码中先是将输入的数赋给一个int型变量x,再将x赋值给数组。其实可以直接将输入的数赋给数组,这就需要用到指针。修改后的代码如下:
#include<stdio.h>
#define maxn 105
int a[maxn];
int main(){int n = 0;while(scanf("%d", a+n) == 1)n++;for(int i = n-1; i >= 1; i--)printf("%d ", a[i]);printf("%d\n", a[0]);return 0;
}
因为数组名a起到指向数组首元素的指针的作用,所以可以通过a加上一个自加的n来返回数组各元素的地址,从而将输入的数据直接存入对应的地址中。
根据n++先返回自加前的值,然后再自加的特点,可以将上面的while循环进一步改写如下:
#include<stdio.h>
#define maxn 105
int a[maxn];
int main(){int n = 0;while(scanf("%d", a+n++) == 1);for(int i = n-2; i >= 1; i--)printf("%d ", a[i]);printf("%d\n", a[0]);return 0;
}
注意相比之前的代码,这时n会多自加1次(因为n++写在while语句的循环条件判断中,当输入CTRL+Z结束时,n++又被执行了1次),所以for循环的初始值应改为n-2。
需要特别说明的是,虽然数组名起到指针的作用,但它本质上只是一个常量指针。因为是常量,所以不能改变自己的值,因而改变地址时要用a+n,不能写成a++。
不过,咱们可以创建一个指针,让它指向数组的首元素,再对这个指针进行自加操作,代码如下:
#include<stdio.h>
#define maxn 105
int a[maxn];
int main(){int *p = a; //定义指针指向数组首元素while(scanf("%d", p++) == 1);for(p=p-2; p > a; p--)printf("%d ", *p);printf("%d\n", *p);return 0;
}
必须提醒的是,指针加来加去非常容易出错,所以能不用还是尽量不要用。