【问题标题】:Passing an array to a sort function in C language将数组传递给C语言中的排序函数
【发布时间】:2014-05-25 03:01:49
【问题描述】:
#include<stdio.h>
#include<conio.h>

float smallest(int arr[],int k,int n);
void sort(int arr[],int n);

void main()
{
 int arr[20],i,n,j,k;
 clrscr();
 printf("\nEnter the number of elements in the array: ");
 scanf("%d",&n);

 printf("\nEnter the elements of the array");
 for(i=0 ; i < n ; i++)
 {
  printf("\n arr[%d] = ",i);
  scanf("%d",&arr[i]);
 }

 sort(arr,n);
 printf("\nThe sorted array is: \n");
 for(i=0 ; i < n ;  i++)
 printf("%d\t",arr[i]);
 getch();
}

int smallest(int arr[],int k,int n)//smallest function
{
 int pos=k,small=arr[k],i;
 for(i=k+1;i<n;i++)
 {
  if(arr[i]<small)
  {
   small=arr[i];
   pos=i;
  }
 }
 return pos;
}


void sort(int arr[],int n)//sorting function
{
 int k,pos,temp;
 for(k=0 ; k < n ; k++)
  {
   pos=smallest(arr,k,n);
   temp=arr[k];
   arr[k]=arr[pos];
   arr[pos]=temp;
  }
}

在上面的程序中,排序函数是从 main 调用的,但 sort 的返回类型是 void,它仍然返回排序后的数组。在对数组进行排序后,该函数应将排序后的数组返回给调用函数以打印排序后的数组,但程序运行良好。这是怎么回事?

【问题讨论】:

  • 你将数组传递给函数,函数直接作用于该数组,因为 C 中的数组是通过引用传递的。它不返回任何东西,而是对传递给它的参数起作用
  • @mangusta 数组不是通过引用传递的。
  • @mangusta 错了,一切都是按值传递的。数组衰减为指针。你不能传递一个函数,只能传递一个函数pointer.
  • @mangusta: 你不能说pass by reference,C 中没有reference 那样的东西,你可以说passed as pointer。正如 self 试图解释的那样,在 C 中只有按值传递。
  • @all 任何人都可以发布正确答案吗?请。我认为如果数组是通过引用传递的,那么正如 mangusta 所说,不需要返回

标签: c arrays algorithm sorting selection-sort


【解决方案1】:

当你声明时

int arr[20];

你可以说“arr 是一个由 20 个整数组成的数组”。但是 arr 也是一个整数指针,指向一行 20 中的第一个整数。所以取消引用 *arr 是一个整数,其实和 arr[0] 一样。

这意味着当你将arr 传递给一个函数时,你只会传递一个指向该函数的指针。本例中的函数作用于(复制的)指针。但是这个指针指向的内存与在main() 中声明的原始arr 完全相同。这就是为什么在sort() 中操作arr 实际上是在main() 中操作arr 的原因。

【讨论】:

    【解决方案2】:

    当将数组作为参数传递时,this

    int smallest(int arr[],int k,int n)
    

    意思和

    完全一样
    int smallest(int *arr,int k,int n)
    

    例如

    #include<iostream>
    void printArray(int data[])
    {
      for(int i = 0, length = sizeof(data); i < length; ++i)
      {
        std::cout << data[i] << ' ';
      }
      std::cout << std::endl;
    }
    
    int main()
    {
      int data[] = { 5, 7, 8, 9, 1, 2 };
      printArray(data);
      return 0;
    }
    

    您将看到仅打印了数组的前 4 个元素。 sizeof(data) 返回值 4!这恰好是用于将数组传递给printArray() 的指针的大小。 首先,数组不会被复制。复制指向数组第一个元素的指针

    【讨论】:

    • @amit 我希望现在它会有所帮助。
    【解决方案3】:

    首先,使用 return 语句与根据函数返回类型的表达式传递或未传递的函数参数之间没有任何联系。

    虽然确实所有在 C 中传递的参数都是按值传递的 - 将值复制到“局部参数变量” - 对于 指针 所在的内存位置会发生什么,我们没有任何假设参考。因此,函数可以在调用环境中进行任何更改,即使没有返回值。

    关于声明为aType name[]的参数。这只是const aType* name 的语法糖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2018-11-14
      • 2012-07-25
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多