数组名的指针用法

发布于:2024-04-15 ⋅ 阅读:(189) ⋅ 点赞:(0)

【题目描述】

读入一些整数,逆序输出到一行中,数中间用空格隔开。已知整数不超过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;
}

必须提醒的是,指针加来加去非常容易出错,所以能不用还是尽量不要用。


网站公告

今日签到

点亮在社区的每一天
去签到