Passer un tableau à une fonction de tri en langage C
-
20-12-2019 - |
Question
#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;
}
}
Dans le programme ci-dessus, la fonction de tri est appelée depuis main mais le type de retour de sort
est vide et renvoie toujours le tableau trié.Comme après avoir trié le tableau, la fonction doit renvoyer le tableau trié à la fonction appelante pour imprimer le tableau trié, mais le programme fonctionne parfaitement.Comment ça se passe ?
La solution
Quand tu déclares
int arr[20];
vous pouvez dire "arr est un tableau de 20 entiers".Mais arr est également un pointeur vers un entier, pointant vers le premier entier d'une rangée de 20.Donc déréférencement *arr
est un entier, le même que arr[0]
En fait.
Cela signifie que quand tu passes arr
à une fonction, vous transmettez uniquement un pointeur vers cette fonction.La fonction dans ce cas fonctionne sur le pointeur (copié).Mais ce même pointeur pointe exactement vers la même mémoire que votre original arr
déclaré dans main()
.Et c'est la raison pour laquelle manipuler arr
dans sort()
est en fait en train de manipuler arr
dans main()
.
Autres conseils
Lors du passage d'un tableau en paramètre, ceci
int smallest(int arr[],int k,int n)
signifie exactement la même chose que
int smallest(int *arr,int k,int n)
Par exemple
#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;
}
Vous verrez que seuls les 4 premiers éléments du tableau sont imprimés.Le sizeof(data)
renvoie une valeur de 4 !Il s'agit de la taille du pointeur utilisé pour transmettre le tableau à printArray()
.Premièrement, le tableau n'est pas copié.Le pointeur vers le premier élément du tableau est copié
Premièrement, il n'y a aucun lien entre un argument de fonction et ce qui est ou n'est pas transmis à l'aide d'un return
instruction avec une expression selon le type de retour de la fonction.
S'il est vrai que tous les paramètres transmis en C se font par valeur - copiez la valeur dans une "variable de paramètre locale" - rien n'est supposé sur ce qui va se passer à l'emplacement mémoire a. aiguille fait référence.Ainsi, une fonction peut apporter des modifications à l'environnement appelant, même sans renvoyer de valeur.
Quant aux paramètres déclarés comme étant aType name[]
.c'est simplement du sucre syntaxique pour const aType* name
.