webentwicklung-frage-antwort-db.com.de

Wird in C++ ein Zeigerargument als Wert übergeben?

Wird in C++ ein Zeigerargument als Wert übergeben? Da ich sehe, dass jede Änderung des Zeigers als solche nicht außerhalb der Methode widerspiegelt. Die Änderungen, die ich durch Dereferenzieren des Zeigers vornehme, werden jedoch wiedergegeben.

Ist es in diesem Fall eine akzeptable/standardmäßige Prozedur, Zeiger auf Zeiger als Argument für eine Funktion zu verwenden, um den Zeigerwert als solchen innerhalb einer Funktion zu ändern?

26
Sulla

Ja zu beiden. 

Zeiger werden wie alles andere als Wert übergeben. Das heißt, der Inhalt der Zeigervariable (die Adresse des Objektes, auf das gezeigt wird) wird kopiert. Das heißt, wenn Sie den Wert des Zeigers im Funktionshauptteil ändern, wird diese Änderung nicht im externen Zeiger widergespiegelt, der weiterhin auf das alte Objekt zeigt. Sie können jedoch den Wert des Objekts ändern, auf das gezeigt wird.

Wenn Sie Änderungen an dem Zeiger auf den externen Zeiger (dh auf etwas anderes zeigen) widerspiegeln möchten, benötigen Sie zwei Ebenen der Dereferenzierung (Zeiger auf Zeiger). Beim Aufrufen von Funktionen wird dazu ein & vor dem Namen des Zeigers gesetzt. Es ist die Standardmethode von C, Dinge zu tun.

Bei der Verwendung von C++ wird die Verwendung von Referenzen als Zeiger bevorzugt (fortan auch Zeiger auf Zeiger).

Für die why -Verweise sollten Zeiger vorgezogen werden. Dafür gibt es mehrere Gründe:

  • referenzen führen zu weniger Syntaxrauschen als Zeiger im Funktionskörper
  • referenzen enthalten mehr Informationen als Zeiger, als für Compiler nützlich sein können

Nachteile von Referenzen sind meistens:

  • sie brechen die einfache Pass-by-Value-Regel von C, wodurch das Verständnis des Verhaltens einer Funktion in Bezug auf Parameter (werden sie geändert werden) weniger offensichtlich sind. Um sicher zu gehen, benötigen Sie auch einen Funktionsprototyp. Das ist jedoch nicht wirklich schlechter als die bei C verwendeten mehreren Zeigerstufen.
  • sie werden nicht von C unterstützt. Dies kann ein Problem sein, wenn Sie Code schreiben, der sowohl mit C- als auch mit C++ - Programmen funktionieren sollte (dies ist jedoch nicht der üblichste Fall).

Im speziellen Fall des Zeigers auf den Zeiger besteht der Unterschied meistens in der Einfachheit, bei der Verwendung der Referenz kann es jedoch auch leicht sein, beide Ebenen von Zeigern zu entfernen und nur eine Referenz anstelle eines Zeigers auf Zeiger zu übergeben.

30
kriss

Ich verstehe die Verwirrung hier. Die Begriffe "nach Wert" und "nach Referenz" sind nicht so klar, auch wenn sie so scheinen. Denken Sie daran, dass der Computer diese Konzepte nicht kennt und sich nicht danach verhält. Der Computer kennt die Typen nicht. Daher unterscheidet es nicht zwischen Zeigern und Werten. Lassen Sie mich versuchen, es anhand eines Beispiels zu erklären:

void func1(int x)
{
   x = 5;
}

void func2(int *x)
{
   int a;
   x = &a;
}

Die Operation ist für die Maschine in beiden Funktionen gleich: Sie holt das Argument und ändert es. Beachten Sie, dass in der zweiten Funktion * x nicht modifiziert wird, sondern x

Wenn wir nun diese Funktionen aufrufen,

int y = 10;

func1(y); //value of y does not change

func2(&y); //value of &y does not change, but the value of the address which y points may change. 

Ich bevorzuge es zu sagen, Grundsätzlich ist jeder Funktionsaufruf "Call by Value" . Im Falle eines Zeigertyps haben wir jedoch die Möglichkeit, den Inhalt einer anderen Adresse im Speicher zu ändern. 

Wenn wir func2 as geschrieben hätten

void func2(int *x)
{ 
   *x = 5; 
}

Dann wäre dies ein echter Fall von "Call by reference". 

8
Atilla Baspinar

Ja ist es, wie es in C. ist.

Ist es in diesem Fall eine akzeptable/standardmäßige Prozedur, Zeiger-zu-Zeiger als Argument für eine Funktion zu verwenden, um den Zeigerwert als solchen innerhalb einer Funktion zu ändern?

In welchem ​​Fall? Was willst du? Sie können echte Verweise mit dem Modifizierer & verwenden.

void func(type &ref);
0
nils

Übergebe den Wert mit Zeigern Ich erkläre es anhand eines Beispiels:

void f(int *ptr)
{
   cout<<*ptr;
}


int main ()
{
   int a=10;
   int *aptr=&a;
   f(aptr);
   return 0;
} 

In der Hauptfunktion ist a eine Ganzzahlvariable mit dem Inhalt 10 und der Adresse 00F8FB04 (angenommen). aptr ist ein Zeiger auf eine Ganzzahl, die die Adresse der Ganzzahlvariablen a speichert. aptr-Inhalt ist also die Adresse der Ganzzahlvariablen a mit dem Wert 00F8FB04. Wenn wir aptr als Funktionsargument übergeben, wird nur der Inhalt von aptr (also die Adresse) in den Funktionsparameter kopiert. Also, ptr wird die Kopie des Inhalts von aptr erhalten (das ist die Adresse 00F8FB04)

0
Umair Mubasher

Verwenden Sie entweder einen Zeiger auf einen Zeiger oder einen Verweis auf einen Zeiger, wenn Sie den Zeiger selbst möglicherweise ändern möchten. Zu Ihrer ursprünglichen Frage werden technisch alle Parameter per Wert übergeben.

0
Jim Buck