Frage

Diese Frage hat hier bereits eine Antwort:

Ich verstehe nicht, warum das Übergeben eines Zeigers an eine Funktion die übergebenen Daten nicht ändert. Wenn das Funktionsproto so aussah:

void func( int *p ); 

Und func hat Pem Speicher an P bereitgestellt, warum kann er nicht außerhalb der Funktion verwendet werden? Ich dachte, dass Zeiger Adressen wären?

War es hilfreich?

Lösung

Während so etwas das tut, was Sie erwarten:

void func(int *p)
{
    *p = 1;
}

int a = 2;
func(&a);
// a is now 1

das tut nicht

void func(int *p)
{
    p = new int;
}

int *p = NULL;
func(p);
// p is still NULL

In beiden Fällen funktioniert die Funktion mit a Kopieren des ursprünglichen Zeigers. Der Unterschied besteht darin, dass Sie im ersten Beispiel versuchen, die zugrunde liegende Ganzzahl zu manipulieren, die funktioniert, weil Sie seine Adresse haben. Im zweiten Beispiel manipulieren Sie den Zeiger direkt, und diese Änderungen gelten nur für die Kopieren.

Es gibt verschiedene Lösungen dafür; Es hängt davon ab, was Sie tun möchten.

Andere Tipps

Argumente in C und C ++ werden übergeben nach Wert. Das heißt, wenn die Art des Arguments ein Zeiger ist int, dann erhält die Funktion a Kopieren des tatsächlichen Zeigerarguments, während er dennoch in der Lage ist, das zu ändern int Sein wies auf.

Es ist wirklich schwer zu sagen, was Sie fragen.

Meine Vermutung - Sie können den Speicher ändern, der vom Zeiger gezeigt wird p, aber Sie können den Zeiger nicht "weiterleiten" oder löschen (oder Speicher zuweisen)? Wenn ja, übergeben Sie Ihren Zeiger als Referenz:
void func( int &*p )
Oder als Doppelzeiger
void func( int **p )
Um es ändern zu können (ich spreche über den Zeiger)

Zeiger sind Adressen. Wenn Sie einen Zeiger in eine Funktion übergeben, kann die Funktion die außerhalb des Bereichs der Funktion erstellten Daten ändern. Wenn Sie jedoch einen Speicher innerhalb einer Funktion zur Verwendung außerhalb der Funktion zuweisen möchten, müssen Sie einen doppelten Zeiger übergeben. Der Grund dafür ist, dass Zeiger von Wert übergeben werden und die Zuordnung dem Zeiger für den neu zugewiesenen Block einen neuen Wert zuweist. Dieser neue Wert geht jedoch verloren, wenn die Funktion zurückgibt. Sie können diese Methode jedoch verwenden, um das zu tun, was Sie brauchen:

void func(int * * pp)
{
    * pp = new int;
}

Verwenden Sie den Func so:

int * myPointer;
func(& myPointer);
// do stuff with myPointer
delete myPointer;

Ich würde Nikolais Antwort nicht zustimmen. In C ++ gibt es zwei Möglichkeiten, die Argumente zu verabschieden.

f(Type Name)

ist Ihr Fall, wo Typ ist int* und Name ist p (beachten Sie, dass int *p tatsächlich bedeutet int* p). In diesem Fall in Ihrer Funktion Name ist ein Kopieren des Objekts, das Sie an die Funktion übergeben.

Der zweite Weg

f(Type & Name)

macht keine Kopie, erstellt sondern eine alias Stattdessen zum Objekt, damit Sie das ursprüngliche Objekt ändern können.

In Ihrem Fall ist das Objekt der Zeiger eines Typs int*. Wenn Sie es mit der ersten Syntax übergeben, erhalten Sie eine Kopie davon, die Sie ändern, und der ursprüngliche Zeiger bleibt unverändert. Wenn Sie den ursprünglichen Zeiger ändern möchten, sollten Sie ihn durch Referenz übergeben, so für Typ=int* und Name=p du würdest bekommen

f(int*& p)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top