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

时间:2014-01-01 19:26:06

标签: c arrays function sorting pointers

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

但是我想知道,因为在函数返回之后内存被返回到堆栈,为什么数组中的值没有被重新分配给其他东西,其次有一种方法我可以使用内存地址来更改实际的数组排序函数里面的main函数然后返回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;

}

然后主要的for循环将我的数组(称为unsorted_array)分配给指针,因为它通过在排序函数内创建的数组递增

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

整个过程都是作为一个程序工作,但我只是想知道为了建立知识(没有用C编程很长时间),有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

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

即可
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中对数组进行。

答案 1 :(得分:0)

我认为你,“在主函数中创建一个新数组”意味着这样的事情:

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);

即。调用afun只复制指针,而不是将数组复制到被调用函数的堆栈。