Ich bin schwer zu verstehen, wie Zeiger funktionieren. Die Art, wie ich es bekam, ist, dass, wenn ich einen Zeiger auf, sagen wir, Int, deklariere ich sowohl eine Variable, die eine Adresse enthält (die initialisiert werden muss, um sogar auf dem Int zu operieren) und eine int-Variable. Visuell würde ich dies so darstellen (Adresse; Int). Wenn ich zum BeispielPointer von Zeiger und Pass durch Referenz
int* number;
deklariert hätte, hätte ich "number" als Adressvariable und "* number" als int-Variable.
Ebenso sollte das Deklarieren von etwas wie int ** d bedeuten, einen Zeiger auf (Adresse; int) zu erzeugen. Das wäre [Adresse; (Adresse; Int)].
In diesem Sinne habe ich versucht, den Int-Wert von ** d zu ändern, indem Sie eine externe Funktion, incrementer_3, und diese so genannte Pass by Referenz, aber ich bekomme einen Fehler bei der Laufzeit. Also habe ich mich gefragt, was ich vermisse.
#include <stdio.h>
void incrementer(int* a) {
(*a)++;
}
void incrementer_2(int** a) {
(**a)++;
}
void incrementer_3(int*** a) {
(***a)++;
}
int main() {
int b = 7;
incrementer(&b);
printf("%d\n", b);
int* c = (int*)malloc(sizeof(int));
*c = 4;
incrementer_2(&c);
printf("%d\n", *c);
int** d = (int**)malloc(sizeof(int*));
**d = 6;
incrementer_3(&d);
printf("%d\n", **d);
system("pause");
}
FYI der Teil, wenn ich b und c arbeite, funktioniert gut. Nebenbei habe ich mich gefragt, ob es möglich ist, den Wert von * c zu ändern, indem Sie die Funktion "incrementer" und nicht "incrementer_2" verwenden. In der Tat dachte ich nur, dass ich einfach aus dem Haupt
geschrieben haben könnteincrementer(&(*c));
oder in einer einfacheren Art und Weise
incrementer(c);
aber keiner von ihnen zur Laufzeit arbeiten.
'** d = 6;' - dies ruft undefiniertes Verhalten auf. Sie haben '* d' nicht initialisiert. –
Warum nicht einfach 'int * c = & b;' und 'int ** d = & c;'? –
Beachten Sie auch, dass C nicht "durch Verweis übergeben" hat, es kann nur * durch die Verwendung von Zeigern und der Adresse-of-Operator * emuliert werden. –