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. :)

War es hilfreich?

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“

gebraucht

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top