Pointers und Funktionen in C ++
-
21-09-2019 - |
Frage
Von den Vorträgen Notizen eines Kurses an der Universität, auf "Call-by-value":
void fun(int *ip) { *ip =100; }
genannt durch
int n=2; int *np; np = &n; fun(np);
würde den Wert von n auf 100 ändern.
Wenn wir sagen, „int * ip“, was genau meinen wir? Ein Zeiger vom Typ Integer? Wenn ja, wenn wir Spaß () aufrufen, mit np als Argument, sollte es kein Fehler sein, wie np die Adresse von n hat, was nicht eine ganze Zahl ist?
Und dann ändern wir den Wert von ip bis 100, so auch nicht das bedeutet, dass n nun den Wert, der in dem „Speicher-Slot“ mit der Adresse hat 100? Ich bin sicher, ich bin etwas fehlt. :)
Lösung
Ein Zeiger vom Typ integer?
Nein, ein Zeiger eine ganze Zahl.
, wenn wir Spaß () aufrufen, mit np als Argument, sollte es kein Fehler sein, wie np die Adresse von n hat, was nicht eine ganze Zahl ist?
n
eine ganze Zahl, so gibt es kein Problem. &n
, np
und ip
alle die gleiche Art haben in Ihrem Code. int*
Und dann ändern wir den Wert von ip bis 100
Nein ... wir den Wert von *ip
ändern, nicht von ip
. Das heißt, wir ändern den Wert, dass ip
auf (die auch manchmal genannt wird pointee ).
Andere Tipps
Ja, wenn Sie int *
als Parameter Art von fun
verwenden Sie sagen es einen Zeiger auf einen int akzeptiert. Da np
ist ein Zeiger auf einen int es in fun
vorbei in Ordnung ist.
np
und ip
verweisen auf die Adresse des n
, so dass, wenn Sie einen Wert wie *ip = 42
zuweisen, wird es den Wert von 42 auf den Speicherplatz zuweisen, dass ip
zeigt auf -. Die n
ist
Was Sie in dem Beispielcode haben heißt vorbei Zeiger . Ihre Funktion hat einen Parameter des Typs Zeiger auf integer . So wird der Wert der Funktion übergeben ist die Adresse der Variablen n
. Die Funktion weist auf die Variable 100
(d.h. eine Speicherstelle) deutete auf durch den Zeiger Parameter ip
. Der Stern *
ist der Dereferenzierungsoperator in C / C ++.
in fun (), Sie ändern den Wert von ip bis 100, Sie ändern die an der Speicherstelle, auf die durch ip.
type*
als eine Art bedeutet „ein Zeiger auf diesen Typ“
gemeinsame Nutzung ist int *var
, aber Ich mag es als int* var
zu schreiben, wie, dass es eine bessere Unterscheidung macht aus dereferenceing einem Zeiger, das heißt *ptr
.
so int* a
Mittel ist, a ein Zeiger auf ein Objekt des Typs int, *a
bedeutet das Objekt, auf das durch ein &a
und Mittel, um die Adresse des Objekts a.
denken np
als Typ int*
. Beachten Sie, dass der Stern für diesen Zweck und die int
zusammen einen „Zeiger auf int“ Typ machen, und sind nicht trennbar.
ip
ist ein Zeiger, mit ip*
Sie den „Memory-Slot“ Zugriff auf es zeigt. np
ist auch ein Zeiger. &n
Verwenden Sie die Adresse des Speicherplatzes von n
zu np
zuweisen. Also, wenn fun()
Aufruf innerhalb fun()
den einzigen Speicher-Slot, auf die zugegriffen ist, ist die eine der n
und damit zu n
100 zugeordnet ist.
gibt einige Verwirrung hier möglich, weil beide n und np speichern Zahlen - aber beim Kompilieren, wird der Compiler verwenden Sie die Zahlen unterschiedlich; Das heißt, während
n++;
und
np++;
sind beide tatsächlich arithmetische Operationen, die erzeugte Baugruppe unterscheidet. Es ist wichtig zu erinnern, dass letztlich alle Daten in den Computer sind Zahlen. Sie werden verschiedene Typen von Daten, nur weil wir sie anders zu behandeln.
Insbesondere in Bezug auf Ihr Beispiel:
*np = 100;
müssen Sie daran denken, dass die *
Mittel dereferenzieren , und dass der Betrieb geschieht vor der Zuweisung. Es kann mit überflüssigen Klammern klarer sein:
(* (np) ) = 100;
oder in einem anderen Zusammenhang:
int n = *np;
Nun, ich muss sagen, es wärmt mein Herz, wenn Sie sagen,
wir den Wert von ip ändern zu 100, so auch nicht das bedeutet, dass n nun den Wert, der in dem „Speicher-Slot“ mit der Adresse hat 100? wie es täuscht, was ich als ein wichtiges Verständnis betrachten. Aber ich glaube, ich habe recht, wenn ich sage, müssen Sie Ihren Weg gehen, so etwas zu Zeiger tun:
static_cast<int>(np) = 100;
Dies würde tun, was Sie beschrieben, weil es den Computer erzählt die Zahl zu behandeln, die np als eine andere Art von Zahl ist; in der gleichen Art und Weise würde, dass die Anzahl np static_cast<char*>(np)
Punkte als ein Zeichen behandeln, und nicht als eine ganze Zahl ist.