459 Stimmen

Warum Pointer verwenden?

Ich weiß, dass dies eine wirklich grundlegende Frage ist, aber ich habe gerade erst mit einigen grundlegenden C++-Programmierungen begonnen, nachdem ich einige Projekte mit Hochsprachen programmiert habe.

Grundsätzlich habe ich drei Fragen:

  1. Warum Pointer anstelle von normalen Variablen verwenden?
  2. Wann und wo sollte ich Pointer verwenden?
  3. Wie verwendet man Pointer mit Arrays?

8 Stimmen

Bereits diskutiert unter dieser Frage Hoffe, das hilft!

0 Stimmen

Eine weitere Diskussion über Pointer hier.

4 Stimmen

Für eine Liste von Büchern, siehe stackoverflow.com/questions/388242/…. Nach Java fand ich Accelerated C++ sehr nützlich.

7voto

vaibhav kumar Punkte 687

Der Bedarf an Pointern in der C-Sprache wird hier beschrieben

Die Grundidee ist, dass viele Einschränkungen in der Sprache (wie die Verwendung von Arrays, Strings und das Ändern mehrerer Variablen in Funktionen) durch die Manipulation des Speicherorts der Daten beseitigt werden könnten. Um diese Einschränkungen zu überwinden, wurden Pointer in C eingeführt.

Weiterhin wird auch gesehen, dass mit Pointern der Code schneller ausgeführt werden kann und Speicher gespart werden kann, wenn Sie große Datentypen (wie eine Struktur mit vielen Feldern) an eine Funktion übergeben. Eine Kopie solcher Datentypen vor der Übergabe zu erstellen würde Zeit in Anspruch nehmen und Speicher verbrauchen. Dies ist ein weiterer Grund, warum Programmierer Pointer für große Datentypen bevorzugen.

PS: Bitte beachten Sie den bereitgestellten Link für eine ausführliche Erklärung mit Beispielcode.

0 Stimmen

Die Frage bezieht sich auf C ++, diese Antwort bezieht sich auf C.

0 Stimmen

Nein, die Frage ist mit c und c++ getaggt. Vielleicht ist das c-Tag irrelevant, aber es ist von Anfang an hier.

7voto

Sildoreth Punkte 1786

In C++, wenn du Subtyp Polymorphie benutzen möchtest, muss du Pointer verwenden. Siehe diesen Beitrag: C++ Polymorphie ohne Pointer.

Wenn man darüber nachdenkt, macht das wirklich Sinn. Bei der Verwendung von Subtyp-Polymorphie weiß man letztendlich nicht im Voraus, welche Klasse oder Unterklassenimplementierung der Methode aufgerufen wird, da man nicht weiß, um welche Klasse es sich tatsächlich handelt.

Diese Idee, eine Variable zu haben, die ein Objekt einer unbekannten Klasse enthält, ist mit C++'s Standardmethode (nicht-Pointer) zur Speicherung von Objekten auf dem Stack, bei der der zugeordnete Speicherplatz direkt der Klasse entspricht, nicht kompatibel. Hinweis: Wenn eine Klasse 5 Instanzfelder im Vergleich zu 3 hat, wird mehr Speicherplatz benötigt.


Beachten Sie, dass bei der Verwendung von '&' um Argumente per Referenz zu übergeben, hinter den Kulissen immer noch Indirektion (d.h., Pointer) beteiligt ist. Das '&' ist nur eine syntaktische Zucker, die (1) Ihnen die Mühe der Verwendung von Pointer-Syntax erspart und (2) dem Compiler erlaubt, strenger zu sein (wie das Verbieten von Null-Zeigern).

1 Stimmen

Nein, du musst keine Zeiger verwenden - du kannst Referenzen verwenden. Und wenn du schreibst "Zeiger sind im Hintergrund involviert" - das ist bedeutungslos. goto Anweisungen werden auch im Hintergrund verwendet - in den Anweisungen der Zielmaschine. Wir behaupten immer noch nicht, sie zu verwenden.

1 Stimmen

@einpoklum-reinstateMonica Wenn Sie eine Reihe von Objekten haben, auf die Sie handeln möchten, jeden einzelnen nacheinander einer temporären Variablen zuweisen und eine polymorphe Methode auf dieser Variablen aufrufen möchten, dann benötigen Sie einen Zeiger, weil Sie eine Referenz nicht neu binden können.

1 Stimmen

Wenn Sie eine Basisklassenreferenz zu einer abgeleiteten Klasse haben und eine virtuelle Methode auf dieser Referenz aufrufen, wird die Überschreibung der abgeleiteten Klasse aufgerufen. Liege ich falsch?

6voto

nobody Punkte 19383

Weil das Kopieren großer Objekte überall Zeit und Speicherplatz verschwendet.

5 Stimmen

Und wie helfen Zeiger dabei? Ich denke, eine Person, die aus Java oder .Net kommt, kennt den Unterschied zwischen dem Stapel und dem Heap nicht, also ist diese Antwort ziemlich nutzlos..

0 Stimmen

Du kannst per Referenz übergeben. Das verhindert das Kopieren.

2 Stimmen

@MatsFredriksson - Anstatt eine große Datenstruktur zu übergeben (zu kopieren) und das Ergebnis wieder zurück zu kopieren, zeigen Sie einfach auf den Speicherort im RAM und ändern ihn dann direkt.

6voto

Jeremy Hahn Punkte 61

Das ist meine Antwort, und ich kann nicht versprechen, ein Experte zu sein, aber ich habe festgestellt, dass Zeiger in einer meiner Bibliotheken, die ich schreibe, großartig sind. In dieser Bibliothek (Es handelt sich um eine Grafik-API mit OpenGL:-)) können Sie ein Dreieck mit an sie übergebenen Vertex-Objekten erstellen. Die draw-Methode nimmt diese Dreieck-Objekte und zeichnet sie basierend auf den von mir erstellten Vertex-Objekten. Nun ja, das ist okay.

Aber was ist, wenn ich eine Vertex-Koordinate ändere? Bewegen oder so mit moveX() in der Vertex-Klasse? Nun ja, jetzt muss ich das Dreieck aktualisieren, indem ich weitere Methoden hinzufüge, und die Leistung wird verschwendet, weil ich das Dreieck jedes Mal aktualisieren muss, wenn sich ein Vertex bewegt. Es ist immer noch keine große Sache, aber es ist nicht so toll.

Jetzt, was ist, wenn ich ein Mesh mit Tonnen von Vertices und Tonnen von Dreiecken habe, und das Mesh rotiert und sich bewegt, und so weiter. Ich müsste jedes Dreieck aktualisieren, das diese Vertices verwendet, und wahrscheinlich jedes Dreieck in der Szene, weil ich nicht wüsste, welche Vertices verwendet werden. Das ist extrem rechenintensiv, und wenn ich mehrere Meshes auf einem Landschaftshintergrund habe, oh Gott! Ich habe ein Problem, weil ich fast jedes Dreieck in fast jedem Frame aktualisiere, weil sich diese Vertices die ganze Zeit ändern!

Mit Zeigern müssen Sie die Dreiecke nicht aktualisieren.

Wenn ich drei *Vertex-Objekte pro Dreiecks-Klasse hätte, würde ich nicht nur Speicher sparen, weil ein Haufen von Dreiecken nicht drei Vertex-Objekte haben, die an sich groß sind, sondern auch diese Zeiger würden immer auf die Vertices zeigen, für die sie gedacht sind, egal wie oft sich die Vertices ändern. Da die Zeiger immer noch auf denselben Vertex zeigen, ändern sich die Dreiecke nicht, und der Aktualisierungsprozess ist einfacher zu handhaben. Falls ich Sie verwirrt habe, würde ich es nicht bezweifeln, ich möchte nicht behaupten, ein Experte zu sein, ich möchte nur meinen Senf dazu geben.

3voto

Marioh Punkte 872

In Java und C# sind alle Objektreferenzen Zeiger, das Gute an C++ ist, dass du mehr Kontrolle darüber hast, wohin dein Zeiger zeigt. Denke daran: Mit großer Macht kommt große Verantwortung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X