Вопрос

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

Это было полезно?

Решение

Когда вы заявляете

int arr[20];

вы можете сказать: "arr - это массив из 20 целых чисел".Но arr также является указателем на целое число, указывая на первое целое число в строке из 20.Таким образом, отсылка к *arr является целым числом, таким же, как arr[0] на самом деле.

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

Другие советы

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

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 элемента массива напечатаны.Генеракодицетагкод возвращает значение 4!Это происходит размером указателя, используемого для передачи массива для sizeof(data). Сначала массив не копируется.Указатель на первый элемент массива скопирован

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

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

как к параметрам, объявленным как генеракодицетагкод.Это просто синтаксический сахар для aType name[].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top