Passando um array para uma função de classificação em linguagem C
-
20-12-2019 - |
Pergunta
#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;
}
}
No programa acima, a função sort está sendo chamada de main, mas o tipo de retorno de sort
é nulo e ainda retorna a matriz classificada.Como depois de classificar o array, a função deve retornar o array classificado de volta à função de chamada para imprimir o array classificado, mas o programa funciona perfeitamente.Como isso está acontecendo?
Solução
Quando você declara
int arr[20];
você pode dizer "arr é uma matriz de 20 números inteiros".Mas arr também é um ponteiro para um número inteiro, apontando para o primeiro número inteiro em uma linha de 20.Então desreferenciando *arr
é um número inteiro, o mesmo que arr[0]
na verdade.
Isso significa que quando você passa arr
para uma função você passa apenas um ponteiro para essa função.A função neste caso funciona no ponteiro (copiado).Mas este mesmo ponteiro aponta exatamente para a mesma memória do seu original arr
declarado em main()
.E essa é a razão pela qual manipular arr
em sort()
na verdade está manipulando arr
em main()
.
Outras dicas
Ao passar um array como parâmetro, isso
int smallest(int arr[],int k,int n)
significa exatamente o mesmo que
int smallest(int *arr,int k,int n)
Por exemplo
#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;
}
Você verá que apenas os primeiros 4 elementos do array são impressos.O sizeof(data)
retorna um valor de 4!Esse é o tamanho do ponteiro usado para passar o array para printArray()
.Primeiro, o array não é copiado.O ponteiro para o primeiro elemento do array é copiado
Primeiro, não há conexão entre qualquer argumento de função que é ou não passado usando um return
instrução com uma expressão de acordo com o tipo de retorno da função.
Embora seja verdade que toda passagem de parâmetro em C é por valor - copie o valor para uma "variável de parâmetro local" - nada é assumido sobre o que acontecerá no local de memória a ponteiro está referenciando.Assim, uma função pode fazer qualquer alteração no ambiente de chamada, mesmo sem retornar um valor.
Quanto aos parâmetros declarados como sendo aType name[]
.isso é apenas açúcar sintático para const aType* name
.