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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top