C语言的指针问题。!!

为什么把 星r替换成r就可以正常输出啊,星r和r不都是保存数组最后一个元素吗

img

# include <stdio.h>

void move(int * p, int m, int n)
{
    int * q, *r;
    *r = *(p + m - 1);
    for (q=p+m-1; q>p; --q)
    {
        *q = *(q-1);
    }
    *p = *r;
    --n;
    if(n>0)
    move(p, m, n);
}

int main(void)
{
    int m;
    printf("您想要输入几个数字,数字个数m=\n");
    scanf("%d", &m);
    int a[100], i, n;
    printf("请输入%d个数字,数字之间用空格隔开\n", m);
    for(i=0; i<m; ++i)
    scanf("%d", &a[i]);
    printf("请输入向后移动的位数n\n");
    scanf("%d", &n);
    
    move(a, m, n);
    
    for(i=0; i<m; ++i)
    printf("%5d", a[i]);
    
        
    return 0;
}

int *r; 这定义了一个整形指针变量 r ,且这个指针是个野指针,把数组最后一位的数据保存到 *r 就出错了。int r; 是定义一个整形变量 r 。这么改下,帮助理解:

#include <stdio.h>
void move(int * p, int m, int n)
{
    int  t, * q, *r = &t; // 修改
    *r = *(p + m - 1);
    for (q=p+m-1; q>p; --q)
    {
        *q = *(q-1);
    }
    *p = *r;
    --n;
    if(n>0)
       move(p, m, n);
}

int main(void)
{
    int m;
    printf("您想要输入几个数字,数字个数m=\n");
    scanf("%d", &m);
    int a[100], i, n;
    printf("请输入%d个数字,数字之间用空格隔开\n", m);
    for(i=0; i<m; ++i)
        scanf("%d", &a[i]);
    printf("请输入向后移动的位数n\n");
    scanf("%d", &n);

    move(a, m, n);

    for(i=0; i<m; ++i)
        printf("%5d", a[i]);

    return 0;
}

定义的时候是 intr;再往后r是指针,指向地址,r代表指向该地址的值


可以看下c语言参考手册中的 c语言-指针

学习一下