Pasar una matriz a una función de clasificación en lenguaje C
-
20-12-2019 - |
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?
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
.