Hier ist ein Beispiel, das ich zuvor verwendet habe. Es sei angenommen, die folgenden zwei Funktionen:
void foo(T *p) // where T is an arbitrary data type
{
*p = new_value(); // write new value to the thing p points to
}
void bar(void)
{
T var;
foo(&var); // write new value to var
}
Für Funktion foo
den Inhalt var
(ein Objekt vom Typ T
) aktualisieren wir einen Zeiger auf var
(Typen T *
) passieren müssen.
Wenn wir T
mit einem Zeigertyp P *
ersetzen, dann wird der obige Code wird
void foo(P **p)
{
*p = new_value(); // write new value to the thing p points to
}
void bar(void)
{
P *var;
foo(&var); // write new value to var
}
Die Semantik ist genau die gleiche; wir wollen foo
einen neuen Wert zu var
schreiben, so übergeben wir einen Zeiger auf var
. Es ist nur, dass in diesem Fall var
bereits ein Zeigertyp ist, so dass wir einen Zeiger auf einen Zeiger übergeben. ein weiteres Dereferenzierungsebene immer als die Art der var
Grundsätzlich für foo
den Inhalt var
zu aktualisieren, müssen Sie den Ausdruck&var
als Argument, dh die Art der formalen Parameter übergeben p
wird.
Type of var Type of &var Type of p
----------- ------------ ---------
T T * T *
T * T ** T **
T ** T *** T ***
usw.
Technisch C unterstützt nicht alles, aber nach Wert übergeben. –
@JoachimPileborg: "Technisch"? In welchem Aspekt unterstützt Pass-by-Reference mehr als jede andere Turing-Complete-Sprache? – Olaf
C, C++, Java und jede Sprache, von der ich je gehört habe, gehen nach Wert. Aber Sie können Verweise (oder Zeiger) nach Wert übergeben, was es ein wenig verwirrend macht. – alain