【题目描述】
读入一些整数,逆序输出到一行中,数中间用空格隔开。已知整数不超过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++。
不过,咱们可以创建一个指针,让它指向数组的首元素,再对这个指针进行自加操作,代码如下:文章来源:https://www.toymoban.com/news/detail-852849.html
#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;
}
必须提醒的是,指针加来加去非常容易出错,所以能不用还是尽量不要用。文章来源地址https://www.toymoban.com/news/detail-852849.html
到了这里,关于数组名的指针用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!