数组通过指针变化之后,如何使其回到初始化时的状态?

问题遇到的现象和发生背景
     刚刚触碰到指针这一块,想把之前的一些内容融合到一起去检查自己的成果,结果发现自己道行尚浅
     具体内容:
   首先使用指针对数组进行初始化,初始化完成之后进行数组的排序以及倒序排列,初始化和排序都没什么问题,但是进行到倒序时发现,程序对排序之后的数组进行了倒序,发现情况之后才恍然大悟,指针直接改变了原始数组。
运行结果及报错内容
#include<stdio.h>

void initArr(int *p,int leng)
{
    int i;
    
    printf("您一共要输入%d个数字\n",leng);
    for(i=0;i<leng;i++)
    {
        printf("请输入第%d个数字:\n",i+1);
        scanf("%d",&p[i]);
    }
} 

void printArr(int *p,int leng)
{
    int i;
    
    for(i=0;i<leng;i++)
    {
        printf("%d\t",p[i]);
    }
    printf("\n");
}

void maxToMinArr(int *p,int leng)
{
    int i;
    int j;
    int m;
    
    for(i=0;i<leng;i++)
    {
        for(j=0;j<leng-1-i;j++)
        {
            if(p[j]<p[j+1])
            {
                m=p[j];
                p[j]=p[j+1];
                p[j+1]=m;
            }
        }
    }
}

void revengeArr(int *p,int leng)
{
    int i,j;
    int m;
    for(i=0;i<leng/2;i++)
    {
        j=leng-1-i;
        m=p[i];
        p[i]=p[j];
        p[j]=m;
    }
}

int main()
{
    int x;
    printf("请输入您要对比数字的个数:\n");
    scanf("%d",&x);
    int arr[x];        
    int *p;
    p=arr;
    int leng;
    leng=sizeof(arr)/sizeof(arr[0]);
    
    initArr(p,leng);
    printf("数组初始化完成!\n");
    printArr(p,leng);
    maxToMinArr(p,leng);
    printf("数组从大到小排列:\n");
    printArr(p,leng);
    printf("倒序排列为:\n");
    revengeArr(p,leng);
    printArr(p,leng);
    
    return 0;
}

img

我的解答思路和尝试过的方法

我所能想到的一种办法:
定义一个arr2,在初始化完成之后令arr2=arr
后续用到初始数组时针对arr2进行操作。

我想要达到的结果

有没有一种方式可以在不定义arr2的情况下使数组回到最初定义的状态?希望各位可以帮忙和解答!感谢!

让p=arr;就可以从新回到arr数组的开始了啊
函数中传入的p会随着操作改变,但是arr这个数组的首地址不会改变的,所以在你需要重置回数组首地址的地方,让p=arr就可以了。

如果你需要保留数组arr中原始数据的顺序,就只能用一个新的数组arr2保存原来的数据。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632