Передача массива в функцию сортировки на языке C

#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 недействителен, и она по-прежнему возвращает отсортированный массив. Так как после сортировки массива функция должна вернуть отсортированный массив вызывающей функции для печати отсортированного массива, но программа работает отлично. Как это происходит?


person sdvadsa    schedule 11.04.2014    source источник
comment
вы передаете массив функции, и функция работает с этим массивом напрямую, поскольку массивы в C передаются по ссылке. он ничего не возвращает, он скорее работает с переданным ему аргументом   -  person mangusta    schedule 11.04.2014
comment
@mangusta Массивы не передаются по ссылке.   -  person this    schedule 11.04.2014
comment
Статически объявленные массивы @self передаются по ссылке. функции тоже. все остальное в C передается по значению   -  person mangusta    schedule 11.04.2014
comment
@mangusta Неправильно, все передается по значению. Массивы распадаются на указатели. Вы не можете передать функцию, только указатель функции.   -  person this    schedule 11.04.2014
comment
Лучше всего размещать компилируемый код. Вам нужно пересмотреть соглашения о комментировании C; void sort(int arr[],int n)\\sorting function не является началом определения функции, за которым следует комментарий! Поскольку вы используете <conio.h>, вы должны быть в Windows, поэтому void main() допустимо, но лучше использовать int main(void) или int main(int argc, char **argv) при использовании аргументов командной строки.   -  person Jonathan Leffler    schedule 11.04.2014
comment
@self, ну, если мы поставим вещи таким образом, то да, все распадается на указатели, но когда мы объявляем какой-то массив, скажем, <type> array[size]; и передаем array, подразумевается сам объявленный массив, а не &array[0]. это означает, что передается не дубликат array, а указатель на его первый элемент   -  person mangusta    schedule 11.04.2014
comment
@mangusta: вы не можете сказать pass by reference, в C нет ничего, кроме reference, вы можете сказать passed as pointer. Как пытается объяснить self, в C существует только передача по значению.   -  person Don't You Worry Child    schedule 11.04.2014
comment
@MadHatter верно, passed as pointer описывает это лучше   -  person mangusta    schedule 11.04.2014
comment
@all, может ли кто-нибудь опубликовать правильный ответ? пожалуйста. я думаю, что если массивы передаются по ссылке, то возврат не требуется, как сказал мангуста   -  person sdvadsa    schedule 11.04.2014
comment
@user3056685: Не запутайтесь, я думаю, что TobiMcNamobi хорошо объясняет это в своем ответе.   -  person Don't You Worry Child    schedule 11.04.2014


Ответы (3)


Когда вы объявляете

int arr[20];

вы можете сказать, что «arr — это массив из 20 целых чисел». Но arr также является указателем на целое число, указывающим на первое целое число в строке из 20. Таким образом, разыменование *arr является целым числом, фактически таким же, как arr[0].

Это означает, что когда вы передаете arr функции, вы передаете только указатель на эту функцию. Функция в этом случае работает с (скопированным) указателем. Но этот самый указатель указывает точно на ту же память, что и ваш оригинальный arr, объявленный в main(). И именно поэтому манипулирование arr в sort() на самом деле манипулирование arr в main().

person TobiMcNamobi    schedule 11.04.2014

При передаче массива в качестве параметра это

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(). Сначала массив не копируется. Указатель на первый элемент массива копируется

person aurilio    schedule 11.04.2014
comment
@amit Надеюсь, теперь это полезно. - person aurilio; 11.04.2014

Во-первых, нет никакой связи между любым аргументом функции, который передается или не передается с помощью оператора return с выражением в соответствии с типом возвращаемого значения функции.

Хотя это правда, что все параметры в C передаются по значению — скопируйте значение в «локальную переменную параметра» — ничего не предполагается относительно того, что должно произойти в ячейке памяти, на которую ссылается указатель. Таким образом, функция может вносить любые изменения в вызывающую среду, даже не возвращая значения.

Что касается параметров, объявленных как aType name[]. это просто синтаксический сахар для const aType* name.

person laune    schedule 11.04.2014