Pregunta

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

En el programa anterior, la función de clasificación se llama desde main pero el tipo de retorno de sort es nulo y todavía devuelve la matriz ordenada.Como después de ordenar la matriz, la función debería devolver la matriz ordenada a la función de llamada para imprimir la matriz ordenada, pero el programa se ejecuta perfectamente.¿Cómo está pasando eso?

¿Fue útil?

Solución

cuando declaras

int arr[20];

puedes decir "arr es una matriz de 20 números enteros".Pero arr también es un puntero a un número entero, que apunta al primer número entero de una fila de 20.Entonces desreferenciando *arr es un número entero, lo mismo que arr[0] En realidad.

Esto significa que cuando pasas arr a una función solo se pasa un puntero a esa función.La función en este caso funciona en el puntero (copiado).Pero este mismo puntero apunta exactamente al mismo recuerdo que su original. arr declarado en main().Y esa es la razón por la que manipular arr en sort() de hecho está manipulando arr en main().

Otros consejos

Al pasar una matriz como parámetro, este

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

significa exactamente lo mismo que

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

por ejemplo

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

Verá que solo se imprimen los primeros 4 elementos de la matriz.¡El sizeof(data) devuelve un valor de 4!Eso sucede como el tamaño del puntero que se usa para pasar la matriz a printArray(). Primero la matriz no se copia.El puntero al primer elemento de la matriz se copia

En primer lugar, no existe conexión entre ningún argumento de función que se pasa o no mediante un return declaración con una expresión de acuerdo con el tipo de retorno de la función.

Si bien es cierto que todos los parámetros que se pasan en C son por valor (copie el valor a una "variable de parámetro local"), no se supone nada sobre lo que sucederá en la ubicación de memoria a. puntero está haciendo referencia.Entonces, una función puede realizar cualquier cambio en el entorno de llamada, incluso sin devolver un valor.

En cuanto a los parámetros declarados como aType name[].esto es simplemente azúcar sintáctico para const aType* name.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top