Frage

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

Im obigen Programm wird die Sortierfunktion von main aufgerufen, aber der Rückgabetyp von sort ist ungültig und gibt trotzdem das sortierte Array zurück.Nach dem Sortieren des Arrays sollte die Funktion das sortierte Array an die aufrufende Funktion zurückgeben, um das sortierte Array zu drucken, aber das Programm läuft einwandfrei.Wie passiert das?

War es hilfreich?

Lösung

Wenn Sie erklären

int arr[20];

Sie können sagen: „arr ist ein Array von 20 ganzen Zahlen“.Aber arr ist auch ein Zeiger auf eine Ganzzahl und zeigt auf die erste Ganzzahl in einer Reihe von 20.Also Entreferenzierung *arr ist eine ganze Zahl, das Gleiche wie arr[0] Tatsächlich.

Das bedeutet, wenn Sie bestehen arr An eine Funktion übergeben Sie nur einen Zeiger auf diese Funktion.Die Funktion arbeitet in diesem Fall auf dem (kopierten) Zeiger.Aber genau dieser Zeiger zeigt genau auf denselben Speicher wie Ihr Original arr erklärt in main().Und das ist der Grund, warum man manipuliert arr In sort() manipuliert tatsächlich arr In main().

Andere Tipps

Bei der Übergabe eines Arrays als Parameter ist dies der Fall

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

bedeutet genau dasselbe wie

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

Zum Beispiel

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

Sie werden sehen, dass nur die ersten 4 Elemente des Arrays gedruckt werden.Der sizeof(data) gibt einen Wert von 4 zurück!Das ist zufällig die Größe des Zeigers, an den das Array übergeben wird printArray().Erstens wird das Array nicht kopiert.Der Zeiger auf das erste Element des Arrays wird kopiert

Erstens gibt es keine Verbindung zwischen einem Funktionsargument, was mit a übergeben wird oder nicht return -Anweisung mit einem Ausdruck entsprechend dem Rückgabetyp der Funktion.

Es stimmt zwar, dass alle Parameterübergaben in C nach Wert erfolgen – kopieren Sie den Wert in eine „lokale Parametervariable“, – es wird jedoch nichts davon angenommen, was am Speicherort a passieren soll Zeiger verweist.Eine Funktion kann also beliebige Änderungen in der aufrufenden Umgebung vornehmen, auch ohne einen Wert zurückzugeben.

Bezüglich der als Sein deklarierten Parameter aType name[].das ist lediglich syntaktischer Zucker für const aType* name.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top