在C中使用内存地址更改函数内部的数组,而不使用指针

在C中使用内存地址更改函数内部的数组,而不使用指针,c,arrays,function,sorting,pointers,C,Arrays,Function,Sorting,Pointers,在教程上学习指针、数组和函数时,我意识到我可以通过在主函数中创建新数组来实现从函数返回数组的目标,创建一个指针并将函数的返回值分配给该指针,然后在主函数中使用for循环递增指针以将数组的值重新分配给排序函数内部的数组 但是,我想知道,既然在函数返回后内存会返回堆栈,那么为什么数组中的值不会被重新分配给其他对象,其次,是否有一种方法可以使用内存地址更改排序函数中主函数中的实际数组,然后返回void?我使用的是气泡排序算法,这是我当前的排序函数 #include <stdbool.h>

在教程上学习指针、数组和函数时,我意识到我可以通过在主函数中创建新数组来实现从函数返回数组的目标,创建一个指针并将函数的返回值分配给该指针,然后在主函数中使用for循环递增指针以将数组的值重新分配给排序函数内部的数组

但是,我想知道,既然在函数返回后内存会返回堆栈,那么为什么数组中的值不会被重新分配给其他对象,其次,是否有一种方法可以使用内存地址更改排序函数中主函数中的实际数组,然后返回void?我使用的是气泡排序算法,这是我当前的排序函数

#include <stdbool.h>
int *arr_sort(int *arr){    

int *ptr = arr;
bool flag = true;
while(flag){

    flag = false;
    int i = 0;
    for(i;i<4;i++){
        if(arr[i]>arr[i+1]){
            flag = true;
            arr[i]+=arr[i+1];
            arr[i+1] = arr[i]-arr[i+1];
            arr[i]-= arr[i+1];
            }

        //  printf("%d : %d\t%d : %d \n",i,arr[i],i+1,arr[i+1]); *Included to display the values as they are being switched
    }
printf("\n\n");
}   

return arr;
}

然后,main中的for循环将名为unsorted_array的数组分配给指针,指针通过排序函数中创建的数组递增

    ptr = arr_sort(unsorted_array);
        for(j;j<5;j++){
        unsorted_array[j]=*(ptr+j);

整个过程都是一个程序,但我只是想知道,为了积累知识,我已经很久没有用C编程了,有没有更好的方法来实现这一点?

无需从函数返回数组。只需将您的函数定义为

void arr_sort(int *arr){    

     bool flag = true;
     while(flag){

         flag = false;
         int i;
         for(i = 0; i < 4; i++){
              if(arr[i] > arr[i+1]){
                   flag = true;
                   arr[i]+=arr[i+1];
                   arr[i+1] = arr[i]-arr[i+1];
                   arr[i]-= arr[i+1];
              }

         }
         printf("\n\n");
     }   
}  

对arr的任何和所有更改都将对main中的数组进行。

我假设您在main函数中创建新数组意味着:

int main(int argc, const char *argv[]) 
{
   char unsorted_array[ARRAY_SIZE];
   // ... Code
}
调用另一个函数时,堆栈上的任何变量、平凡变量、指针或数组都会被保留,但当函数返回时,被调用函数位于堆栈上的任何变量都会失效

但是:堆栈上的指针可能指向堆上的数组。也就是说,如果数组由malloc分配,在函数中声明为静态,或者是全局变量。在这种情况下,数组的内容当然会在函数返回时保留,并且可以通过返回指针等方式使调用函数可用。当函数返回时,只有指针(例如通常为4个字节)被复制到调用函数堆栈,而不是指针指向的数组

类似地,通过向被调用函数提供指向数组的指针,可以使堆栈上的数组对被调用函数可用,就像您所做的那样。复制到被调用函数堆栈的只是指针4个字节,因此被调用函数可以访问和修改数组,并且数组本身不会在函数返回时失效

注意:在C语言中,调用声明为

void afun(char anarray[ARRAY_SIZE);
void afun(char *anarray);
编译器隐式地将函数视为声明为

void afun(char anarray[ARRAY_SIZE);
void afun(char *anarray);

i、 e.调用afun只会将指针而不是数组复制到被调用函数的堆栈。

你说的w/o是什么意思?是的,对不起,我不想让标题太长;不灵。int i在for循环外初始化,我尝试过,但无法使其工作。不过我会再试一次。函数返回类型是否为void?这对您有帮助吗?如果是的话,你可以在这里说谢谢