Linux C-Programmieranleitung Teil 8 – Aufruf nach Wert vs. Aufruf nach Zeiger/Adresse

In unserem ersten Teil dieser laufenden Tutorialreihe haben wir kurz über Funktionen, einschließlich ihrer Deklaration und ihres Körpers, diskutiert. Was wir damals nicht diskutiert haben, war die Vielzahl der Arten, wie Funktionen aufgerufen werden. Hier, in diesem Tutorial, werden wir schnell die bestehenden Möglichkeiten diskutieren.

In der Sprache C können Sie eine Funktion auf mehrere Arten aufrufen: Aufruf nach Wert und Aufruf nach Zeiger oder Adresse. Lassen Sie uns diese beiden Konzepte anhand einiger leicht verständlicher Beispiele diskutieren.

Nehmen wir an, Sie wollen ein Programm schreiben, das zwei Werte vertauscht. So können Sie das machen:

#include <stdio.h>
int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

c = a;
a = b;
b = c;

printf("\nSwapped values are: %d and %d", a,b);

return 0;
}

Hier ist die Ausgabe dieses Codes mit den eingegebenen Werten 5 und 9:

Enter two integer values
5 9
Entered values are: 5 and 9
Swapped values are: 9 and 5

Nehmen wir an, die Anforderung ist, eine separate Funktion zu haben – sagen wir ’swap‘ – die die gesamte Arbeit des Austauschs übernimmt und immer dann aufgerufen werden kann, wenn der Programmierer zwei Werte vertauschen möchte. Nachfolgend finden Sie den Code, der dies tut:

#include <stdio.h>
void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

Da haben Sie es. Es wurde eine separate Funktion namens „swap“ erstellt, die zwei Werte (ursprünglich vom Benutzer eingegeben und in der „Hauptfunktion“ erfasst) als Argumente erhält und diese dann vertauscht und die Ausgabe ausgibt.

Die Art und Weise, wie der ‚Swap‘ hier genannt wurde, ist als ‚call by value‘ bekannt. Der Grund dafür ist, dass beim Aufruf nur die Werte, die von ‚a‘ und ‚b‘ gehalten werden, als Argumente an die ’swap‘-Funktion übergeben werden. Diese Werte werden von den Argumenten ‚val1‘ und ‚val2‘ empfangen, und es sind diese Variablen, an denen der Swap-Prozess durchgeführt wird.

Dies bedeutet, dass die Variablen ‚a‘ und ‚b‘ in der ‚Hauptfunktion‘ auch nach der Durchführung des Austauschs weiterhin die ursprünglichen Werte beibehalten. Aber was ist, wenn die Anforderung darin besteht, die Werte von „a“ und „b“ nach dem Aufruf der „Swap“-Funktion zu vertauschen? Nun, hier kommt die Methode des ‚call by pointer/address‘ ins Spiel.

Im Grunde geht es hier also darum, die Adresse von Variablen (wie in unserem Fall ‚a‘ und ‚b‘) als Argumente zu übergeben. Die aufgerufene Funktion (’swap‘ in diesem Fall) ist so ausgestattet, dass sie Adressen als Argumente empfängt, und dann wird der Swap-Prozess mit den an diesen Adressen gehaltenen Werten durchgeführt, was effektiv bedeutet, dass die Werte der Originalvariablen (‚a‘ und ‚b‘ hier) vertauscht werden.

Nun, im vorigen Absatz haben wir gesagt, dass die Funktion „dafür ausgerüstet ist, Adressen als Argumente zu empfangen“. Nun, mit „ausgestattet“ meinten wir, dass es eine besondere Art von Argumenten hat, die Adressen empfangen können. Diese Argumente sind Variablen vom Typ ‚Zeiger‘. Wir werden ‚Zeiger‘ in einem kommenden Tutorial ausführlich besprechen, aber denken Sie vorerst einfach daran, dass Zeigervariablen Speicheradressen als Werte speichern.

So wird ein Zeiger auf eine Ganzzahl deklariert/definiert:

int *x;

Im Grunde ist x also eine Zeigervariable, die zur Speicherung der Speicheradresse einer ganzzahligen Variablen verwendet werden kann. Angenommen, ‚i‘ ist eine ganzzahlige Variable, dann können Sie ‚x‘ dazu bringen, die Adresse von ‚i‘ zu speichern:

x = &i;

Und wann immer Sie auf den Wert von ‚i‘ bis ‚x‘ zugreifen wollen, schreiben Sie ‚*x‘. So können Sie zum Beispiel den Wert von „i“ auf beispielsweise 10 ändern:

*x = 10;

Mit all dem im Hinterkopf, hier ist, wie Sie ’swap‘ mit der Methode des Aufrufs nach Adresse oder Zeiger aufrufen können:

#include <stdio.h>
void swap (int *val1, int *val2)
{
int temp = 0;

temp = *val1;
*val1 = *val2;
*val2 = temp;

}

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(&a,&b);

printf("\nSwapped values are: %d and %d", a,b);

return 0;
}

Anstatt die Werte von „a“ und „b“ als Argumente zu übergeben, haben wir dieses Mal also die Adressen dieser Variablen übergeben. Bei der ’swap‘-Funktion werden die Adressen in zwei Zeiger-Variablen (‚val1‘ und ‚val2‘) empfangen. Und unter Verwendung der beiden Zeigervariablen vertauscht die Logik direkt die Werte von ‚a‘ und ‚b‘.

Hier ist die Ausgabe:

Enter two integer values 
6 8 
Entered values are: 6 and 8 
Swapped values are: 8 and 6

Schlussfolgerung

Dieser Artikel hätte Ihnen zumindest eine grundlegende Vorstellung davon vermitteln sollen, was „Call by Value“ und „Call by Address/Pointer“ Möglichkeiten des Funktionsaufrufs sind und wann sie verwendet werden können. Probieren Sie die hier aufgeführten Beispiele aus und teilen Sie uns in den folgenden Kommentaren mit, wenn Sie Zweifel oder Fragen haben.

Das könnte dich auch interessieren …