Es gibt verschiedene Schwierigkeiten mit Zeigern:
- Aliasing Die Möglichkeit, den Wert eines Objekts mithilfe verschiedener Namen / Variablen zu ändern.
- Nichtlokalität Die Möglichkeit, einen Objektwert in einem Kontext zu ändern, der sich von dem unterscheidet, in dem er deklariert ist (dies geschieht auch mit Argumenten, die als Referenz übergeben werden).
- Lebensdauerkonflikt Die Lebensdauer eines Zeigers unterscheidet sich möglicherweise von der Lebensdauer des Objekts, auf das er verweist. Dies kann zu ungültigen Verweisen (SEGFAULTS) oder zu Datenmüll führen.
- Zeiger Arithmetik . Einige Programmiersprachen erlauben die Manipulation von Zeigern als Ganzzahlen. Dies bedeutet, dass Zeiger auf beliebige Stellen verweisen können (einschließlich der unerwartetsten Stellen, an denen ein Fehler vorliegt). Um die Zeigerarithmetik korrekt zu verwenden, muss ein Programmierer die Speichergröße der Objekte kennen, auf die verwiesen wird, und darüber sollten Sie mehr nachdenken.
- Typumwandlungen Die Fähigkeit, einen Zeiger von einem Typ auf einen anderen umzuwandeln, ermöglicht das Überschreiben des Speichers eines Objekts, das sich von dem beabsichtigten unterscheidet.
Aus diesem Grund muss ein Programmierer bei der Verwendung von Zeigern gründlicher nachdenken (ich kenne die beiden Abstraktionsebenen nicht ). Dies ist ein Beispiel für die typischen Fehler eines Anfängers:
Pair* make_pair(int a, int b)
{
Pair p;
p.a = a;
p.b = b;
return &p;
}
Beachten Sie, dass Code wie der obige in Sprachen, die kein Zeigerkonzept haben, sondern Namen (Referenzen), Objekte und Werte wie funktionale Programmiersprachen und Sprachen mit Garbage Collection (Java, Python) .
Die Schwierigkeit bei rekursiven Funktionen tritt auf, wenn Personen ohne ausreichenden mathematischen Hintergrund (bei denen die Rekursivität üblich ist und das erforderliche Wissen vorhanden ist) versuchen, sich ihnen zu nähern und glauben, dass sich die Funktion je nachdem, wie oft sie zuvor aufgerufen wurde, unterschiedlich verhält . Dieses Problem wird noch verschärft, weil rekursive Funktionen tatsächlich so erstellt werden können, dass Sie sie so denken müssen, um sie zu verstehen.
Denken Sie an rekursive Funktionen, bei denen Zeiger herumgereicht werden, wie bei einer prozeduralen Implementierung eines Rot-Schwarz-Baums, bei der die Datenstruktur direkt geändert wird. es ist etwas schwieriger zu überlegen als ein funktionales Gegenstück .
Es wird in der Frage nicht erwähnt, aber das andere wichtige Problem, mit dem Anfänger Schwierigkeiten haben, ist die Parallelität .
Wie andere bereits erwähnt haben, gibt es bei einigen Programmiersprachenkonstrukten ein zusätzliches, nicht konzeptionelles Problem: Selbst wenn wir verstehen, können einfache und ehrliche Fehler mit diesen Konstrukten äußerst schwierig zu debuggen sein.