//有n个整数,顺序向后移动m个位置,最后m个数变成最前面的m个数

各位大神,现在这个程序可以运行。但是我不太明白那个递归调用的循环体。如何通过end 跟*p就实现了数组的变换,希望指点迷津。

//有n个整数,顺序向后移动m个位置,最后m个数变成最前面的m个数
//每次移动一个,end为每次替换的数
void move(int array[20],int n,int m){
int p,end;
end=
(array+n-1);
for(p=array+n-1;p>array;p--)
p=(p-1);
*array=end;
m--;
//递归调用,当循环次数m减少到0的时候,停止调用
if(m>0)move(array,n,m);
}
int main(){
int num[20],n,m,i;
printf("共有多少数\n");
scanf("%d",&n);
printf("请输入n个数\n");
for(i=0;i
scanf("%d",&num[i]);
printf("你想要后退多少\n");
scanf("%d",&m);
move(num,n,m);
printf("现在它们是\n");
for(i=0;i
printf("%d ",num[i]);
printf("\n");
return 0;
}

分析见注释,供参考:

#include <stdio.h>
void move(int array[], int n, int m) {
    int *p, end;
    end = *(array + n - 1); //变量 end 保存数组最后一个元素值 array[n-1] 
    for (p = array + n - 1; p > array; p--)//整个数组循环右移一位,p是指针,起始指向数组最后一位 p = &array[n-1]
        *p = *(p - 1);                     //数组元素右移赋值
    *array = end; //将保存在变量end的最后一位元素移动到数组首位值即 array[0] = end;
    printf("m=%d:\n", m);  //以下代码,输出每次右移一位后数组的排列情况
    for (p = array; p < array + n; p++)
        printf("%d ", *p);
    printf("\n");         //到此
    m--;
    //递归调用,当循环次数m减少到0的时候,停止调用
    if (m > 0)  move(array, n, m);
}
int main() {
    int num[20], n, m, i;
    printf("共有多少数\n");
    scanf("%d", &n);
    printf("请输入%d个数\n",n);
    for (i = 0; i < n; i++) 
        scanf("%d", &num[i]);

    printf("你想要后退多少\n");
    scanf("%d", &m);
    move(num, n, m);
    printf("现在它们是\n");
    for (i = 0; i < n; i++)
        printf("%d ", num[i]);
    printf("\n");
    return 0;
}

//共有多少数
//5
//请输入5个数
//1 2 3 4 5
//你想要后退多少
//3
//m = 3:
//5 1 2 3 4
//m = 2 :
//4 5 1 2 3
//m = 1 :
//3 4 5 1 2
//现在它们是
//3 4 5 1 2

*arry *加一个数组名,代表着数组的首位也即arry[0]