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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top