Eure praktische Anwendung/Verwendung von Zeiger und Referenzen?

Hallo in die Runde,

ich lese gerade "Grundkurs C++ " von Jürgen Wolf und Martin Guddat.

Im Kapitel Zeiger steht: "In der reinen C++-Praxis sollten sie die rohen Zeiger nur verwenden, wenn es unbedingt sein muss"

Ich hab die Verwendung bislang aus Unwissenheit auch gemieden, deshalb würde mich interessieren wann ihr Zeiger bzw. Referenzen verwendet und welchen Vorteil ihr dadurch habt. Also selber gebastelte Logiken würden mich interessieren nicht die Anwendung und Verwendung von externen Bibliotheken. Das selbe gilt natürlich auch für Referenzen.

Würde mich freuen über einen Austausch.
Grüße

Erst mal ganz grob: Für mich selbst verwende ich Zeiger vor allem für Arrays (die sind ja schon welche) und ansonsten versuche ich Referenzen zu nutzen. Früher (TM) (ich komme von ANSI-C) habe ich das alles mit Pointern gemacht/machen müssen.

Gruß Tommy

1 Like

wenn ich Klassen im Konstruktor eine Hardwareschicht übergeben muss, dann nehme ich Referenzen (z.B. ein Stream für Serial, oder ein Twowire/I2C)

Wenn es einen Grund gibt, dass ich das erst zur Laufzeit machen will, oder auch NULL möglich sein soll, dann nehme ich Pointer.

1 Like

Referenzen siehst du (hoffentlich) immer wenn du Objekte an Funktionen/Methoden übergibst. Einfach um eine Kopie zu vermeiden.

z.B. bei sowas (vereinfacht):

void readFromSerial(Stream& stream)
{
    if (stream.available() > 0)
       ...
}

Dann kann man Serial, Serial1, etc. an die Funktion übergeben und es ist egal von was man eigentlich lesen will

1 Like

Ich verwende bevorzugt die "Übergabe per Value".
In zweiter Linie, per Referenz, und nur wenn es nicht anders geht, Pointer.
Eine Begründung brauche ich dafür nicht.
(die er ergibt sich ganz automatisch aus den Notwendigkeiten)

Und Beispiele (auch von mir) findet man hier zu Hunderten.

Referenzen sind unveränderlich und können nicht NULL sein.
Pointer erlauben Pointer Arithmetik und können zum Test auf optionale Argumente in Unterprogrammen benutzt werden.

AFAIR war die Erfindung von Referenzen notwendig für die Implementierung von Properties in Klassen.

1 Like

Wie meinst du das?

Weil ohne const kann man die Referenz verändern.

#include <Streaming.h>
Stream &cout {Serial}; 

int wert {10};

void setup()
{
  Serial.begin(9600);
  cout << F("Start: ") << endl;
  cout << F("wert ") << wert << endl;
  
  cout << F("aendere Referenz") << endl;
  aendereReferenz(wert);
  cout << F("wert ") << wert << endl;
  
  cout << F("aendere Referenz") << endl;
  aendereReferenz(wert);
  cout << F("wert ") << wert << endl;
}

void loop()
{ } 

void aendereReferenz (long& var)
{
  var++;
}

Übrigens, wenn man per Value const macht, sollte der Compiler automatisch per Referenz daraus machen. Der ist auch nicht ganz dumm.

Aber im Grunde hat alles seine Daseinsberechtigung. Es kommt immer auf das wann wie und wofür an. Bei Alias kann es Probleme mit Referenzen geben, wenn die Referenz auf eine nicht mehr existierende Variable verweist. Dann stürzt das Programm ab.

1 Like

Der hast den Wert verändert auf den gezeigt wird, nicht die Referenz selbst

1 Like

Okay, Punkt für dich. :wink:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.