Domanda

#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;
  }
}
.

Nel programma sopra la funzione di ordinamento viene chiamata dal principale ma il tipo di ritorno di sort è vuoto e restituisce ancora l'array ordinato.Come dopo l'ordinamento dell'array, la funzione dovrebbe restituire l'array ordinato alla funzione di chiamata per stampare l'array ordinata ma il programma funziona perfettamente.Come sta succedendo?

È stato utile?

Soluzione

Quando dichiari

int arr[20];
.

Puoi dire "ARR è un array di 20 numeri interi".Ma ARR è anche un puntatore su un intero, indicando il primo numero intero in una riga di 20. Quindi il deferenziamento *arr è un numero intero, lo stesso di arr[0] in effetti.

Questo significa quando si passano arr a una funzione supera un puntatore solo a tale funzione.La funzione in questo caso funziona sul puntatore (copiato).Ma questo puntatore punta esattamente alla stessa memoria del arr originale dichiarata in main().E questo è il motivo per cui manipolare arr in sort() è infatti manipolando arr in main().

Altri suggerimenti

Quando si passa un array come parametro, questo

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

significa esattamente lo stesso di

int smallest(int *arr,int k,int n)
.

Ad esempio

#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;
}
.

Vedrai che vengono stampati solo i primi 4 elementi dell'array.Il sizeof(data) restituisce un valore di 4!Ciò accade essere le dimensioni del puntatore utilizzato per passare l'array a printArray(). Prima l'array non viene copiata.Il puntatore al primo elemento dell'array viene copiato

Innanzitutto, non vi è alcuna connessione tra alcun argomento funzione ciò che è o non è passato utilizzando un'istruzione return con un'espressione in base al tipo di ritorno della funzione.

Mentre è vero che tutto il parametro che passa in c è per valore - copia il valore in una "variabile parametro locale" - non si presume nulla su ciò che accade nella posizione di memoria A puntatore èreferenziazione.Quindi, una funzione può apportare modifiche nell'ambiente chiamante, anche senza restituire un valore.

Per quanto riguarda i parametri dichiarati come aType name[].Questo è solo zucchero sintattico per const aType* name.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top