Passando un array in una funzione di ordinamento nella lingua C
-
20-12-2019 - |
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?
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
.