„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Die unausgesprochene Frage: „Warum gibt es Zeiger?“

Die unausgesprochene Frage: „Warum gibt es Zeiger?“

Veröffentlicht am 17.08.2024
Durchsuche:692

The unspoken question: \

Es ist wirklich eine berechtigte Frage

Dies ist keine typische Frage des Pointer-Hassers, sondern eher eine sehr interessante.


Hier ist, was ich meine

Zeiger sind ein großartiges, leistungsstarkes Konzept, aber genau das ist es: ein Konzept. Warum wurde der C-Compiler also mit einem so isolierten Stück Logik und Syntax für Zeiger erfunden?

Verstehen Sie mich nicht falsch, ich liebe die Möglichkeiten, die uns Zeiger bieten, und ihre aktuelle Syntax. Sie sind ein absolut wesentliches Merkmal, da sie die Entwicklung dynamischer Datenstrukturen, Objekte und Klassen, Multithread-Speicherfreigabe, Objektveränderlichkeit, niedrigredundante Wertevervielfältigung und vieles mehr erreicht haben.
Aber wenn man sich das Ereignis der Erfindung von C vorstellt, scheinen die Zeiger in ihrer heutigen Form eine viel beeindruckendere Idee zu sein als ein intuitives erstes Konzept. Schauen wir uns genauer an, was ich meine.


Ein tieferer Blick

Wenn Sie sich die Struktur eines Zeigers ansehen, handelt es sich im Grunde genommen um einen unsigned long (auch bekannt als 4[32-Bit-System] oder 8 Bytes im Speicher). Die Dinge, die Zeiger von vorzeichenlosen Long-Werten unterscheiden, sind die zeigerspezifischen Merkmale.

Syntax- und Dereferenzierungsoperator

Ein Zeiger hat seine eigene Deklarationssyntax und seinen eigenen Operator: den Dereferenzierer.

int a = 5;
int *ptr = &a; //declaration
int value = *ptr; //dereference

Aber stellen wir uns vor, dass dies nie erfunden wurde. Dann wäre Folgendes einfach möglich, wenn die Dereferenzierungsfunktion nur einem beliebigen Ganzzahltyp zugeordnet wäre:

int a = 5;
unsigned long adress = &a;
int value = *adress;

In diesem Fall könnten Sie sogar Folgendes tun:

int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`

Apropos Parser: Dies ist absolut keine widersprüchliche Syntax, da Star als Derefrencer ein unärer Operator ist, während Star als arithmetischer Multiplikator immer ein binärer Operator ist.
Dieser fiktive Dereferenzierungsoperator, wie ich ihn oben beschrieben habe, ist in Wirklichkeit die Essenz des Zeigerkonzepts. Der Vergleich mit der aktuellen realen Implementierung macht die Hauptfrage so interessant, über sie nachzudenken. Es hätte so viele Ergebnisse geben können.

Zeigerarithmetik

Die einzige Besonderheit der Zeigerarithmetik besteht darin, Schriftgrößen bei Berechnungen zu berücksichtigen. Wenn ich ein Array habe und das zweite Element erhalten möchte, füge ich einfach 1 zum Zeiger hinzu. Wenn es sich um einen int-Zeiger handelt, wird dadurch implizit tatsächlich ein Wert von 4 zur Adresse hinzugefügt (wenn sizeof(int) == 4 auf Ihrem System):

int arr[5] = {1,2,3,4,5};
int second = *(arr   1);

Aber seien wir ehrlich, das Folgende ist eigentlich viel logischer, wenn man intuitiv über das Gedächtnis nachdenkt:

int arr[5] = {1,2,3,4,5};
int second = *(arr   sizeof(int));

Und das wäre nur Standard-Ganzzahlarithmetik. Wenn man es so betrachtet, gibt es eigentlich keinen Grund, die Zeigerarithmetik überhaupt erfunden zu haben.


Das ist noch nicht alles

Natürlich macht die '*'-Syntax die beabsichtigten Verwendungen viel klarer. Wenn Sie es sehen, wissen Sie sofort, dass diese Variable zur Speichermanipulation verwendet wird. Außerdem ist jede Funktion der Speichermanipulationsbibliothek für Zeiger konzipiert.

Aber wenn es nie erfunden worden wäre und wir stattdessen diese dereferenzierbaren vorzeichenlosen Longs gehabt hätten, hätten sich die Leute einfach Design- und Namenskonventionen ausgedacht, wie zum Beispiel das Anhängen von Zeigervariablenbezeichnern mit dem Suffix „_p“. Und Bibliotheken zur Speichermanipulation hätten sich einfach darum herum entwickelt.


Letztes Wort

Also wirklich, wenn Sie darüber nachdenken, hätte C genauso überleben können, wie es jetzt lebt, wenn Zeiger nie als Merkmal der Sprache erfunden worden wären. Sie würden lediglich als Konzept von Programmierern erfunden werden und genauso funktionieren, wie sie derzeit existieren.

Ich finde, das ist eine interessante Geschichte, die man genauer untersuchen sollte.
Warum hat C den Zeiger erfunden?
War es genau der Grund, den wir erwarteten: Konsistenz, Klarheit und Sicherheit gegen den Missbrauch der Dereferenzierung?
Oder gibt es einen tieferen Grund und eine viel komplexere Logik als die Art und Weise, wie ich in diesem Beitrag Zeiger behandelt habe, was sie tatsächlich deutlich effizienter macht, als dasselbe mit Allzweck-Ganzzahlen zu tun?

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/ebbewertz/a-dangerous-question-why-do-pointers-exist-dkd Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3