Welche Programmierprobleme lassen sich am besten mit Zeigern lösen? [geschlossen]

58

Nun, ich verstehe im Grunde, wie man Zeiger benutzt, aber nicht, wie man sie am besten benutzt, um besser zu programmieren.

Was sind gute Projekte oder Probleme, die mit der Verwendung von Zeigern gelöst werden müssen, damit ich sie besser verstehen kann?

Dysoko
quelle
Fragen Sie, welche Programmierprobleme am besten mit Hilfe von Zeigern gelöst werden, nicht welche Projekte / Programme. Sie können ein Programm entweder mit Zeigern schreiben oder nicht - sie (Projekte) sind einfach ein zu großes Konstrukt für eine aussagekräftige Antwort.
Oded
37
Programmierprobleme werden mit Zeigern erzeugt, nicht gelöst. :)
xpda
4
Eigentlich frage ich mich, welche Probleme ohne Zeiger gelöst werden können. Sicher nur sehr wenige.
Deadalnix
4
@deadalnix, es hängt davon ab, ob Sie explizite oder implizite Zeiger meinen. Wenn Sie implizite Zeiger meinen (dh irgendwo werden Zeiger verwendet), ist es unmöglich, ein Programm zu schreiben, das den Stack oder den Heap verwendet. Wenn Sie explizite Zeiger meinen, dann sind Sie nicht eingeschränkt. Sie können eine beliebige Größe der Zuordnung vornehmen, indem Sie neue Stack-Frames erstellen (im Grunde genommen mithilfe eines Funktionsaufrufs) und die Zuordnung mithilfe von Tail-Aufrufen aufheben, vorausgesetzt, sie werden vom Compiler optimiert.
Dan_waterworth
3
ugh, einige dieser Antworten sind schrecklich.

Antworten:

68

Wenn Sie große Datenmengen im Speicher bearbeiten, leuchten die Zeiger wirklich.

Das Übergeben eines großen Objekts als Referenz entspricht dem Übergeben einer einfachen alten Zahl. Sie können die benötigten Teile direkt bearbeiten, anstatt ein Objekt zu kopieren, zu ändern und dann die Kopie an die Stelle des Originals zurückzugeben.

user7007
quelle
12
Dies ist eine großartige Antwort, und ich möchte hinzufügen, dass Sie keine großen Objekte benötigen, um große Datenmengen zu bearbeiten. Gelegentlich werden große Objekte manipuliert, aber ein noch häufigeres Problem ist das Manipulieren einer Reihe kleiner Objekte, die wirklich sehr häufig sind. Was, wenn Sie darüber nachdenken, fast alle Computerprogramme betrifft.
jhocking
44

Mit dem Zeigerkonzept können Sie nach Adresse auf Daten verweisen, ohne die Speicherung von Daten zu duplizieren. Dieser Ansatz ermöglicht das Schreiben effizienter Algorithmen wie:

  1. Sortieren
    Wenn Sie Daten in einem Sortieralgorithmus verschieben, können Sie den Zeiger anstelle der Daten selbst verschieben. Sie können beispielsweise Millionen von Zeilen in einer Zeichenfolge von 100 Zeichen sortieren. Sie sparen eine Menge unnötiger Datenbewegungen.

  2. Verknüpfte Listen
    Sie können den nächsten und / oder vorherigen Elementspeicherort und nicht die gesamten mit dem Datensatz verknüpften Daten speichern.

  3. Übergeben von Parametern
    In diesem Fall übergeben Sie die Adresse der Daten anstelle der Daten selbst. Stellen Sie sich erneut einen Algorithmus zur Namenskomprimierung vor, der in Millionen von Zeilen ausgeführt wird.

Das Konzept kann auf Datenstrukturen wie relationale Datenbanken erweitert werden, bei denen ein Zeiger einem Fremdschlüssel ähnelt . In einigen Sprachen wird die Verwendung von Zeigern wie C # und COBOL nicht empfohlen.

Beispiele finden Sie an vielen Stellen wie:

Der folgende Beitrag kann in gewisser Weise relevant sein:

NoChance
quelle
14
Ich würde nicht sagen, dass C # die Verwendung von Zeigern nicht fördert. Stattdessen wird die Verwendung von nicht verwalteten Zeigern nicht empfohlen. In C # gibt es viele Dinge, die als Referenz anstatt als Wert weitergegeben werden.
Blakomen
Nette, gute Erklärung
Sabby
5
Musste für den C # -Kommentar abstimmen. C # -Referenzen sind Zeigern gleichgestellt. Mit C # werden Sie lediglich davon abgehalten, zu wissen, dass es sich in Wirklichkeit nur um einen Zeiger auf ein Objekt im verwalteten Heap handelt.
MattDavey
1
@MattDavey: C # -Referenzen sind keine Zeiger. Sie können sie nicht hinzufügen, zum Indizieren eines Arrays verwenden, mehrfache Indirektion verwenden usw. Sie können beispielsweise keine Verweise auf Verweise haben.
Billy ONeal
5
@ Billy ONeal die Vorstellung, dass "es nur ein Hinweis ist, wenn Sie darauf rechnen können" ist ehrlich gesagt lächerlich, aber ich habe nicht die Geduld, mit Ihnen zu streiten.
MattDavey
29

Ich bin überrascht, dass keine andere Antwort dies erwähnt hat: Mit Zeigern können Sie nicht zusammenhängende und nicht lineare Datenstrukturen erstellen, bei denen ein Element auf komplexe Weise mit mehreren anderen verknüpft sein kann.

Verknüpfte Listen (einfach, doppelt und zirkulär verknüpft), Bäume (rot-schwarz, AVL, trie, binär, Raumaufteilung…) und Diagramme sind Beispiele für Strukturen, die am natürlichsten in Bezug auf Verweise und nicht nur auf Werte konstruiert werden können .

Jon Purdy
quelle
Sie vergessen die XOR-verknüpfte Liste [=
dan_waterworth
@ dan_waterworth: Nein. Ich kenne diese schwarze Magie nur zu gut.
Jon Purdy
8

Ein einfacher Weg ist der Polymorphismus. Polymorphismus funktioniert nur mit Zeigern.

Außerdem verwenden Sie Zeiger immer dann, wenn Sie eine dynamische Speicherzuweisung benötigen. In C geschieht dies normalerweise, wenn Sie Daten in einem Array speichern müssen, aber die Größe zum Zeitpunkt der Kompilierung nicht kennen. Sie würden dann malloc aufrufen, um den Speicher zuzuweisen, und einen Zeiger, um darauf zuzugreifen. Unabhängig davon, ob Sie es wissen oder nicht, verwenden Sie Zeiger, wenn Sie ein Array verwenden.

for(int i = 0; i < size; i++)
   std::cout << array[i];

ist das Äquivalent von

for(int i = 0; i < size; i++)
   std::cout << *(array + i);

Mit diesem Wissen können Sie wirklich coole Dinge tun, wie das Kopieren eines gesamten Arrays in einer Zeile:

while( (*array1++ = *array2++) != '\0')

In c ++ verwenden Sie new, um einem Objekt Speicher zuzuweisen und in einem Zeiger zu speichern. Sie tun dies immer dann, wenn Sie ein Objekt zur Laufzeit anstatt zur Kompilierungszeit erstellen müssen (dh eine Methode erstellt ein neues Objekt und speichert es in einer Liste).

Zeiger besser verstehen:

  1. Finden Sie einige Projekte, die mit traditionellen C-Strings und Arrays herumspielen.
  2. Suchen Sie nach Projekten, die Vererbung verwenden.

  3. Hier ist das Projekt, an dem ich meine Zähne geschnitten habe:

Lesen Sie zwei nxn-Matrizen aus einer Datei ein, führen Sie die grundlegenden Vektorraumoperationen aus und drucken Sie das Ergebnis auf dem Bildschirm aus.

Dazu müssen Sie dynamische Arrays verwenden und durch Zeiger auf Ihre Arrays verweisen, da Sie zwei Arrays von Arrays haben (mehrdimensionale dynamische Arrays). Nachdem Sie das Projekt abgeschlossen haben, haben Sie eine ziemlich gute Idee, wie Sie Zeiger verwenden.

Jonathan Henson
quelle
2
"Polymorphismus funktioniert nur mit Zeigern." Nicht genau: Polymorphismus funktioniert auch mit Referenzen. Was letztendlich ein Hinweis ist, aber ich denke, die Unterscheidung ist wichtig, insbesondere für die Neulinge.
Laurent Pireyn
Ihr Beispiel für das Kopieren eines Arrays in einer Zeile ist das Kopieren einer nullterminierten Zeichenfolge in einer Zeile, nicht irgendeines allgemeinen Arrays.
Tcrosley
8

Um wirklich zu verstehen, warum Zeiger wichtig sind, müssen Sie den Unterschied zwischen der Heap-Zuweisung und der Stapelzuweisung verstehen.

Das Folgende ist ein Beispiel für eine Stapelzuweisung:

struct Foo {
  int bar, baz
};

void foo(void) {
  struct Foo f;
}

Auf dem Stack zugewiesene Objekte existieren nur für die Dauer der aktuellen Funktionsausführung. Wenn der Aufruf foovon den Gültigkeitsbereich verlässt, verlässt auch die Variable den Gültigkeitsbereich f.

Ein Fall, bei dem dies zu einem Problem wird, besteht darin, dass Sie von einer Funktion etwas anderes als einen ganzzahligen Typ zurückgeben müssen (z. B. die Foo-Struktur aus dem obigen Beispiel).

Beispielsweise würde die folgende Funktion zu einem sogenannten "undefinierten Verhalten" führen.

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  struct Foo f;
  return &f;
}

Wenn Sie so etwas wie struct Foo *von einer Funktion zurückgeben möchten, brauchen Sie wirklich eine Heap-Zuordnung:

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  return malloc(sizeof(struct Foo));
}

Die Funktion mallocweist ein Objekt auf dem Heap zu und gibt einen Zeiger auf dieses Objekt zurück. Es ist zu beachten, dass der Begriff "Objekt" hier lose verwendet wird und "etwas" anstelle von Objekt im Sinne einer objektorientierten Programmierung bedeutet.

Die Lebensdauer von Heap-zugewiesenen Objekten wird vom Programmierer gesteuert. Der Speicher für dieses Objekt wird reserviert, bis der Programmierer ihn freigibt, dh durch Aufrufen free()oder bis das Programm beendet wird.

Bearbeiten : Ich habe nicht bemerkt, dass diese Frage als C ++ - Frage markiert ist. Die C ++ - Operatoren newund new[]führen die gleiche Funktion aus wie malloc. Die Operatoren deleteund delete[]sind analog zu free. Während newund deleteausschließlich zum Zuweisen und Freigeben von C ++ - Objekten verwendet werden sollte, ist die Verwendung von mallocund freeim C ++ - Code vollkommen legal.

Mike Steinert
quelle
1
(+1) auch bekannt als "statisch zugewiesene Variablen" und "dynamisch zugewiesene Variablen" ;-)
umlcat
4

Schreiben Sie ein nicht-triviales Projekt in C und Sie werden herausfinden müssen, wie / wann Sie Zeiger verwenden sollen. In C ++ werden Sie meist RAII-fähige Objekte verwenden, die Zeiger intern verwalten, in C-Raw-Zeigern jedoch eine weitaus häufigere Rolle spielen. Was für ein Projekt Sie tun sollten, es kann alles sein, was nicht trivial ist:

  • Ein winziger und einfacher Webserver
  • Unix-Kommandozeilen-Tools (less, cat, sort etc.)
  • Ein tatsächliches Projekt, das Sie für sich selbst und nicht nur zum Lernen durchführen möchten

Ich empfehle den letzten.

Viktor Dahl
quelle
Also gehe ich einfach zu einem Projekt, das ich machen möchte (wie ein 2D-Spiel) und es wird angenommen, dass ich Zeiger brauche und lerne?
Dysoko
3
Nach meiner Erfahrung ist es der beste Weg zu lernen, echte Projekte zu realisieren, die von Ihren Fähigkeiten her nicht zu erreichen sind. Konzepte können durch Lesen und Schreiben kleiner "Spielzeug" -Programme erlernt werden. Um jedoch wirklich zu lernen, wie Sie diese Konzepte verwenden können, um bessere Programme zu schreiben, müssen Sie einfach Nicht-Spielzeug-Programme schreiben.
Viktor Dahl
3

Fast alle Programmierprobleme, die mit Zeigern gelöst werden können, können mit anderen sichereren Referenztypen gelöst werden (nicht mit Bezug auf C ++ - Referenzen , aber das allgemeine CS-Konzept, eine Variable zu haben, bezieht sich auf den Wert von Daten, die an anderer Stelle gespeichert sind).

Zeiger, bei denen es sich um eine spezielle Implementierung von Verweisen auf niedriger Ebene handelt, bei denen Sie Speicheradressen direkt bearbeiten können, sind sehr leistungsfähig, können jedoch in der Verwendung etwas gefährlich sein (z. B. auf Speicherorte außerhalb des Programms verweisen).

Die direkte Verwendung von Zeigern hat den Vorteil, dass sie etwas schneller sind, da keine Sicherheitsprüfungen durchgeführt werden müssen. Sprachen wie Java, die Zeiger im C-Stil nicht direkt implementieren, leiden unter leichten Leistungseinbußen, reduzieren jedoch viele Arten von schwierig zu debuggenden Situationen.

Was den Grund für die Notwendigkeit einer Indirektion angeht, ist die Liste ziemlich lang, doch im Wesentlichen lauten die beiden Schlüsselideen:

  1. Das Kopieren von Werten großer Objekte ist langsam und führt dazu, dass das Objekt zweimal im RAM gespeichert wird (möglicherweise sehr kostspielig). Das Kopieren nach Referenz erfolgt jedoch fast augenblicklich, wenn nur wenige Bytes RAM (für die Adresse) verwendet werden. Angenommen, Sie haben ~ 1000 große Objekte (jedes entspricht etwa 1 MB RAM) im Speicher, und Ihr Benutzer muss in der Lage sein, das aktuelle Objekt auszuwählen (das vom Benutzer bearbeitet wird). Eine Variable selected_object, die auf eines der Objekte verweist, ist wesentlich effizienter als das Kopieren des Werts des aktuellen Objekts in eine neue Variable.
  2. Komplexe Datenstrukturen, die sich auf andere Objekte wie verknüpfte Listen oder Bäume beziehen, wobei jedes Element in der Datenstruktur auf andere Elemente in der Datenstruktur verweist. Der Vorteil des Verweises auf andere Elemente in der Datenstruktur besteht darin, dass Sie nicht jedes Element in der Liste im Speicher verschieben müssen, nur weil Sie ein neues Element in die Mitte der Liste eingefügt haben (es kann konstante Zeiteinfügungen geben).
Dr. Jimbob
quelle
2

Die Bildbearbeitung auf Pixelebene ist mit Zeigern fast immer einfacher und schneller. Manchmal ist es nur mit Zeigern möglich.

Dave Nay
quelle
1
Ich denke nicht, dass die Aussage "manchmal ist es nur mit Zeigern möglich" wahr ist. Es gibt Sprachen, die dem Entwickler keine Hinweise geben, die jedoch zur Lösung von Problemen im selben Bereich verwendet werden können.
Thomas Owens
Vielleicht ... Ich kenne nicht alle verfügbaren Sprachen, aber ich möchte auf keinen Fall eine Routine schreiben, um einen Faltungsfilter auf ein Bild anzuwenden, das eine Sprache ohne Zeiger verwendet.
Dave Nay
@Thomas, während Sie korrekt sind, handelt es sich bei der Frage um c ++, das dem Entwickler Zeiger anzeigt.
Jonathan Henson
@ Jonathan Auch wenn Sie ein Problem in einer Sprache lösen können, in der keine Zeiger verfügbar sind, können Sie dieses Problem auch in einer Sprache lösen, in der Zeiger verfügbar sind, ohne Zeiger zu verwenden. Das macht den ersten Satz wahr, aber den zweiten Satz falsch - es gibt (meines Wissens nach) keine Probleme, die ohne die Verwendung von Zeigern nicht gelöst werden können.
Thomas Owens
1
Im Gegenteil, bei der Bildverarbeitung handelt es sich häufig um "Koordinatenarithmetik", bei der beispielsweise der Sinus und der Cosinus eines Winkels mit den x- und y-Koordinaten multipliziert werden. In anderen Fällen ist eine umlaufende oder nicht umrandete Pixelreplikation erforderlich. In diesem Sinne ist die Zeigerarithmetik eher unzureichend.
rwong
1

Zeiger werden in so vielen Programmiersprachen unter der Oberfläche verwendet, ohne den Benutzer darüber zu ärgern. Mit C / C ++ haben Sie nur Zugriff darauf.

Verwendung: So oft wie möglich, da das Kopieren von Daten ineffizient ist. Wann Sie sie nicht verwenden sollen: Wenn Sie zwei Kopien möchten, die einzeln geändert werden können. (Was im Grunde dazu führt, dass der Inhalt von object_1 an eine andere Stelle im Speicher kopiert und ein Zeiger zurückgegeben wird - diesmal auf object_2)

mmlac
quelle
1

Zeiger sind ein wesentlicher Bestandteil jeder Datenstrukturimplementierung in C, und Datenstrukturen sind ein wesentlicher Bestandteil jedes nicht trivialen Programms.

Wenn Sie erfahren möchten, warum Zeiger so wichtig sind, sollten Sie lernen, was eine verknüpfte Liste ist, und versuchen, eine Liste zu schreiben, ohne Zeiger zu verwenden. Ich habe Ihnen keine unmögliche Herausforderung gestellt. (TIPP: Mit Zeigern wird auf Speicherstellen im Speicher verwiesen. Wie verweisen Sie auf Elemente in Arrays?)

dan_waterworth
quelle
+1 für die Erwähnung von Datenstrukturen ist die Verwendung in Algorithmen eine natürliche Folge.
Matthieu M.,
0

Beispiel aus der Praxis: Erstellen eines Limit-Orderbuchs.

Der ITCH 4.1-Feed hat beispielsweise das Konzept, Aufträge zu ersetzen, bei denen sich die Preise (und damit die Priorität) ändern können. Sie möchten Aufträge entgegennehmen und an einen anderen Ort verschieben können. Das Implementieren einer Warteschlange mit zwei Enden und Zeigern macht die Operation sehr einfach.

Foo Bah
quelle
0

Beim Durchsuchen der verschiedenen StackExchange-Sites stelle ich fest, dass es ziemlich angesagt ist, eine solche Frage zu stellen. Mit der Gefahr von Kritik und Abstimmungen bin ich ehrlich. Das soll nicht trollen oder flammen, ich will nur helfen, indem ich eine ehrliche Einschätzung der Frage gebe.

Und diese Einschätzung lautet wie folgt: Dies ist eine sehr seltsame Frage, die sich ein C-Programmierer stellen muss. Ziemlich alles, was es sagt, ist "Ich weiß nicht, C." Wenn ich ein bisschen weiter und zynischer analysiere, gibt es einen Grund für die Beantwortung dieser "Frage": "Gibt es eine Abkürzung, die ich verwenden kann, um schnell und plötzlich das Wissen eines erfahrenen C-Programmierers zu erlangen, ohne Zeit darauf zu verwenden? für ein unabhängiges Studium? " Jede "Antwort", die jemand geben kann, ist kein Ersatz dafür, das zugrunde liegende Konzept und seine Verwendung zu verstehen.

Ich finde es konstruktiver, C aus erster Hand zu lernen, als im Internet zu surfen und die Leute danach zu fragen. Wenn Sie C gut kennen, werden Sie sich nicht die Mühe machen, Fragen wie diese zu stellen, sondern fragen: "Welche Probleme lassen sich am besten mit einer Zahnbürste lösen?"

Asveikau
quelle
0

Auch wenn Zeiger bei der Arbeit mit großen Speicherobjekten wirklich strahlen, gibt es immer noch eine Möglichkeit, dies auch ohne sie zu tun.

Die Zeiger sind für die sogenannte dynamische Programmierung unbedingt erforderlich, wenn Sie nicht wissen, wie viel Speicher Sie benötigen, bevor Ihr Programm ausgeführt wird. Bei der dynamischen Programmierung können Sie zur Laufzeit Speicherabschnitte anfordern und Ihre eigenen Daten in diese einfügen. Sie benötigen also Zeiger oder Referenzen (der Unterschied ist hier nicht wichtig), um mit diesen Datenabschnitten arbeiten zu können.

Solange Sie zur Laufzeit einen bestimmten Speicher beanspruchen und Ihre Daten in den neu erfassten Speicher stellen können, können Sie Folgendes tun:

  1. Sie können sich selbst erweiternde Datenstrukturen haben. Dies sind Strukturen, die sich erweitern können, indem sie zusätzlichen Speicher beanspruchen, solange ihre Kapazität erschöpft ist. Die Schlüsseleigenschaft jeder sich selbst erweiternden Struktur besteht darin, dass sie aus kleinen Speicherblöcken (je nach Struktur als Knoten, Listenelemente usw. bezeichnet) besteht und jeder Block Verweise auf andere Blöcke enthält. Diese "verknüpften" Strukturen bilden die Mehrzahl der modernen Datentypen: Diagramme, Bäume, Listen usw.

  2. Sie können mit dem OOP-Paradigma (Object-Oriented Programming) programmieren. Die gesamte OOP basiert auf der Verwendung nicht direkter Variablen, sondern auf Verweisen auf Klasseninstanzen (als Objekte bezeichnet) und deren Manipulation. Keine einzelne Instanz kann ohne Zeiger existieren (auch wenn es möglich ist, nur statische Klassen ohne Zeiger zu verwenden, ist dies eher eine Ausnahme).

Alexander Galkin
quelle
0

Witzig, ich habe gerade eine Frage zu C ++ beantwortet und über Zeiger gesprochen.

In der Kurzversion benötigen Sie NIEMALS Zeiger, es sei denn, 1) die Bibliothek, die Sie verwenden, erzwingt Sie. 2) Sie benötigen eine nullfähige Referenz.

Wenn Sie ein Array, eine Liste, eine Zeichenfolge usw. benötigen, müssen Sie es nur auf dem Stapel haben und ein stl-Objekt verwenden. Das Zurückgeben oder Übergeben von STL-Objekten ist schnell (ungeprüfte Tatsache), da sie internen Code haben, der einen Zeiger anstelle eines Objekts kopiert und die Daten nur dann kopiert, wenn Sie darauf schreiben. Dies ist normales C ++, nicht einmal das neue C ++ 11, das es Bibliotheksschreibern leichter machen wird.

Ihre Frage könnte an dieser Stelle beantwortet werden

Wenn Sie einen Zeiger verwenden, stellen Sie sicher, dass er sich in einer dieser beiden Bedingungen befindet. 1) Sie übergeben eine Eingabe, die möglicherweise nullwertfähig ist. Ein Beispiel ist ein optionaler Dateiname. 2) Wenn Sie Eigentum verschenken möchten. Als ob Sie den Zeiger übergeben oder zurückgeben, haben Sie KEINE Kopien davon übrig, noch verwenden Sie den Zeiger, den Sie verschenken

ptr=blah; func(ptr); //never use ptr again for here on out.

Aber ich habe seit langer Zeit keine Zeiger oder intelligenten Zeiger mehr verwendet und meine Anwendung profiliert. Es läuft sehr schnell.

ZUSÄTZLICHER HINWEIS: Ich stelle fest, dass ich meine eigenen Strukturen schreibe und sie weitergebe. Wie mache ich das, ohne Zeiger zu verwenden? Es ist kein STL-Container, daher ist das Vorbeifahren an ref langsam. Ich lade immer meine Datenliste / deques / maps und so. Ich kann mich nicht erinnern, Gegenstände zurückgegeben zu haben, es sei denn, es handelte sich um eine Liste / Karte. Nicht einmal eine Schnur. Ich habe mir den Code für einzelne Objekte angesehen und dabei { MyStruct v; func(v, someinput); ... } void func(MyStruct&v, const D&someinput) { fillV; }festgestellt, dass ich so etwas mache, dass ich so ziemlich alle Objekte zurückgebe (mehrere) oder eine Referenz vorbelege / übergebe, um sie zu füllen (einzelne).

Wenn Sie nun schreiben, dass Sie eine eigene Deque, Map usw. sind, müssen Sie Zeiger verwenden. Das musst du aber nicht. Lassen Sie STL und möglicherweise steigern Sie die Sorge darüber. Sie müssen nur Daten und die Lösungen schreiben. Keine Container, um sie aufzunehmen;)

Ich hoffe, Sie verwenden jetzt niemals Zeiger: D. Viel Glück beim Umgang mit Bibliotheken, die Sie dazu zwingen

user2528
quelle
0

Zeiger sind sehr nützlich für die Arbeit mit Geräten mit Speicherzuordnung. Sie können eine Struktur definieren, die beispielsweise ein Steuerregister widerspiegelt, und diese dann der Adresse des tatsächlichen Steuerregisters im Speicher zuweisen und direkt bearbeiten. Sie können auch direkt auf einen Übertragungspuffer auf einer Karte oder einem Chip zeigen, wenn die MMU ihn dem Systemspeicher zugeordnet hat.

TMN
quelle
0

Ich sehe Zeiger als Zeigefinger, mit denen wir einige Dinge tun:

  1. Wenn Sie jemand nach etwas fragt, das Sie nicht tragen können, wie z. B. wo sich die Straße befindet, würde ich auf diese Straße "zeigen", und das tun wir im Fall von Argumenten, die sich auf diese Straße beziehen
  2. Wenn wir etwas zählen oder durchqueren, verwenden wir denselben Finger, und das tun wir in Arrays

Bitte vergib diese schlechte Antwort

A.Rashad
quelle
0

Da Ihre Frage mit C ++ markiert ist, beantworte ich Ihre Frage für diese Sprache.

In C ++ wird zwischen Zeigern und Referenzen unterschieden. Daher gibt es zwei Szenarien, in denen Zeiger (oder intelligente Zeiger) erforderlich sind, um bestimmte Verhaltensweisen zu vereinfachen. Sie können unter anderen Umständen verwendet werden, Sie fragen jedoch, wie Sie sie am besten verwenden können, und unter allen anderen Umständen gibt es bessere Alternativen.

1. Polymorphismus

Mit einem Basisklassenzeiger können Sie eine virtuelle Methode aufrufen, die vom Typ des Objekts abhängt, auf das der Zeiger zeigt.

2. Persistente Objekte erstellen

Zeiger sind erforderlich, wenn ein Objekt dynamisch erstellt wird (auf dem Heap anstelle des Stapels). Dies ist erforderlich, wenn die Lebensdauer von Objekten länger sein soll als der Bereich, in dem sie erstellt werden.

In Bezug auf "gute Projekte oder zu lösende Probleme", wie andere bereits gesagt haben, wird jedes nicht-triviale Projekt Zeiger verwenden.

dangerousdave
quelle
Vielleicht würde es jemand vorziehen, ein Objekt zu schneiden, als einen Zeiger zu verwenden.
Viel Spaß