GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

In unserem ersten Teil dieser fortlaufenden Tutorial-Reihe haben wir kurz über Funktionen gesprochen, einschließlich ihrer Deklaration und ihres Hauptteils. Was wir damals nicht besprochen haben, waren die verschiedenen Arten, auf die Funktionen aufgerufen werden. Hier, in diesem Tutorial, werden wir schnell die Möglichkeiten diskutieren, die es gibt.

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

Angenommen, Sie möchten ein Programm schreiben, das zwei Werte vertauscht. So geht's:

#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 nun an, die Anforderung besteht darin, eine separate Funktion zu haben - sagen wir "swap" - die die gesamte Swapping-bezogene Arbeit erledigt und aufgerufen werden kann, wann immer der Programmierer zwei Werte tauschen möchte. Im Folgenden ist der 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;
}

Hier bitteschön. Es wurde eine separate Funktion mit dem Namen „swap“ erstellt, die zwei Werte (ursprünglich vom Benutzer eingegeben und in der „main“-Funktion erfasst) als Argumente empfängt und sie dann vertauscht und die Ausgabe druckt.

Die Art, wie „Swap“ hier genannt wurde, ist als „Call by Value“ bekannt. Der Grund dafür ist, dass beim Aufruf nur die Werte von 'a' und 'b' 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 Austauschprozess durchgeführt wird.

Das bedeutet, dass die Variablen 'a' und 'b' in der 'main'-Funktion weiterhin ihre ursprünglichen Werte enthalten, selbst nachdem die Swap-Operation durchgeführt wurde. Was aber, wenn die Werte von 'a' und 'b' nach Aufruf der 'swap'-Funktion vertauscht werden sollen? Nun, hier kommt die 'call by pointer/address'-Methode ins Bild.

Im Grunde übergeben wir hier also die Adresse von Variablen (wie in unserem Fall 'a' und 'b') als Argumente. Die aufgerufene Funktion (in diesem Fall 'swap') ist so ausgestattet, dass sie Adressen als Argumente empfängt, und dann wird der Swap-Prozess mit den Werten durchgeführt, die an diesen Adressen gespeichert sind, was effektiv Werte der ursprünglichen Variablen bedeutet (hier 'a' und 'b'). ) ausgetauscht werden.

Nun, im vorigen Absatz haben wir gesagt, dass die Funktion "ausgerüstet ist, um Adressen als Argumente zu empfangen". Nun, mit „ausgestattet“ meinten wir, dass es eine spezielle Art von Argumenten hat, die Adressen empfangen können. Diese Argumente sind Variablen vom Typ "Zeiger". Wir werden 'Zeiger' in einem der nächsten Tutorials ausführlich besprechen, aber denken Sie vorerst daran, dass Zeigervariablen Speicheradressen als Werte speichern.

So wird ein Zeiger auf eine ganze Zahl deklariert/definiert:

int *x;

Also ist x im Grunde eine Zeigervariable, die verwendet werden kann, um die Speicheradresse einer ganzzahligen Variablen zu speichern. Angenommen, 'i' ist eine Integer-Variable, dann können Sie 'x' wie folgt dazu bringen, die Adresse von 'i' zu speichern:

x = &i;

Und wann immer Sie auf den Wert von 'i' bis 'x' zugreifen möchten, schreiben Sie '*x'. So können Sie beispielsweise den Wert von „i“ auf beispielsweise 10 ändern:

*x = 10;

In Anbetracht dessen können Sie 'swap' mit der Call-by-Address- oder Pointer-Methode wie folgt aufrufen:

#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 diesmal die Adressen dieser Variablen übergeben. In der 'Swap'-Funktion werden die Adressen in zwei Pointer-Variablen ('val1' und 'val2') empfangen. Und unter Verwendung der beiden Zeigervariablen tauscht die Logik direkt die Werte von 'a' und 'b' aus.

Hier ist die Ausgabe:

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

Dieser Artikel sollte Ihnen zumindest eine grundlegende Vorstellung davon vermittelt haben, was „Call-by-Value“- und „Call-by-Adresse/Zeiger“-Arten des Funktionsaufrufs sind und wann sie verwendet werden können. Probieren Sie die Beispiele aus, die wir hier aufgelistet haben, und lassen Sie es uns in den Kommentaren unten wissen, wenn Sie irgendwelche Zweifel oder Fragen haben.


Linux
  1. C-Programmier-Tutorial Teil 3 - Grundlagen zu Variablen

  2. C-Programmier-Tutorial Teil 5 - Zeichenvariablen

  3. Linux C-Programmier-Tutorial Teil 10 - Variable Gültigkeitsbereiche

  4. Linux C-Programmier-Tutorial Teil 9:Strings

  5. Linux C-Programmier-Tutorial Teil 8 – Aufruf nach Wert vs. Aufruf nach Zeiger/Adresse

So finden Sie die IP-Adresse in Kali Linux

Beispiele für Linux-Curl-Befehle – Teil 2

Beispiele für Linux-Curl-Befehle – Teil 1

Unter Linux ist alles eine Datei – Teil 2

So finden Sie die IP-Adresse unter Linux

So ändern Sie die IP-Adresse unter Linux