Zum Inhalt springen

Pointer und Referenzen


Kristian

Empfohlene Beiträge

Hallo Leute,

Ich bin noch relativ neu bei C++ und noch dabei, die verschiedenen Konzepte zu verstehen.

Deswegen eine Anfrage, ob ich das richtig verstanden habe:

Also, eine Referenz ist eine Möglichkeit, auf eine Variable mit zwei Namen zu zugreifen. Dies kann sowohl in einer, als auch in mehreren Funktionen passieren:



void f(int &a3)

{

 a3=9;

};


void main()

{

 int a1=5;

 int &a2=a;


 a2=7;

 cout<<a1<<endl;     // würde nun 7 herausgeben

 f(a1);

 cout<<a1<<endl;     // ist nun 9

};

Die Gefahr bei der Sache ist aber, daß man im Hauptproggi nicht erkennt, daß die Variable in der Funktion verändert werden kann (deswegen in der Funktion nach möglichkeit mit const erzeugen) Ein Pointer ist quasi eine Referenz, die in einer eigenen Variable abgelegt wird. Mit ihm kann ich z.B. auch auf einzelne Positionen eines Arrays zugreifen (Pointer-Arithmetik).


void f(int *pa)

{

*a=9;

};


void main()

{

int a1=5;

int *pa1=&a1;

char *str="Dies ist ein String";


 *pa1=7;			// jetzt: a1=7

 f(&a);				// jetzt: a1=9

 a1=1;

 f(pa);				// jetzt wieder a1=9


 cout<<str[3]<<endl;		// gibt 's' aus

 cout<<*(str+6)<<endl; 		//gibt 'i' aus

};


ist das so richtig, oder habe ich da noch irgendwelche argen Fehler in meiner Denkweise?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der Computer hat Speicherstellen (Adressen) welche Daten beinhalten können (Werte). Anders ausgedrückt: Der Speicher des Computers beinhaltet Daten, die dadurch angesprochen werden können, daß jeder Stelle eine eindeutige Nummerierung vergeben ist, welche jedoch nicht unbedingt konstant zunimmt (Memory-Mapping-> oft zerstückelter/zusammengebastelter Speicher).

Ich betrachte Referenzen als Kopien einer Adresse, auf die selbst nicht zugegriffen werden kann, sondern lediglich auf ihren Wert im Source kann man für dieselbe Referenz aber verschiedene Namen vergeben. Eine Referenz kann nicht verändert werden, deshalb ist das Const nicht für die Referenz ausschlaggebend, sondern für den Wert, den sie beinhaltet. Deshalb werden auch Referenzen verwendet um unnötige Kopien bei Funktionsaufrufen zu vermeiden (wo ja bei call-by-value die kompletten Wertinhalte auf den Stack kopiert werden und dann innerhalb der Funktion damit gearbeitet wird). Anbei gibt es auch noch das Schlüsselwort mutable mit dem konstante Werte als "kann nicht konstant sein" definiert werden (meist bei Klassenvariablen oder IO-Register oder Werte die auch von "außen" (andere Programme) oder auch von der Hardware verändert werden können ähnliches). Also im Grunde genommen ist das nur eine Frage der Betrachtungsweise, aber so wie Du´s siehst, warum nicht?

Ein Zeiger ist Eine Adresse, die wiederum eine Adresse als Wert enthält, die den eigentlichen Wert beinhaltet. Deshalb kann man Zeiger auch hoch- und runterzählen oder halt einfach verändern und damit werden die Werte aus unterschiedlichen Adressen erreichbar.

Zeiger auf Zeiger geht nochmal einen Schritt weiter. Der Zeiger(1) zeigt auf einen Zeiger(2) welcher auf eine Adresse zeigt(3), die einen Wert beinhaltet. Das hat Sinn, wenn mehrere Programme beispielsweise eine Änderung eines Zeigers mitbekommen sollen - und zwar parallel, damit nichts schiefläuft. Das wird z.B. bei dynamischen DLLs benutzt oder solche globalen Schnittstellen wie COM, DirectX oder ähnliche systemübergreifende Schnittstellen, die jedoch ausgetauscht werden können (oft während der Laufzeit). Es wird dann also bei einer Änderung lediglich Zeiger(2) verändert. Da alle Programme über Zeiger(1) arbeiten werden alle gleichzeitig "umgeschaltet". Vielleicht gibt es noch weitere Existenzberechtigungen (außer dem, die Newbies zu verwirren), aber mir ist da nix anderes aufgefallen.

Die eigenschaft, Zeiger konstant zu halten, bzw. nicht zu vervielfältigen kann man übrigens durch sog. "Smart-Pointer" Classes erreichen. Da werden halt die Operatoren so überschrieben, daß immer nur ein aktueller Zeiger existiert, der halt irgendwo hinzeigt.

Also jedenfalls so habe ich mir das ganze immer vorgestellt und so hat sich auch der ZeigerZeiger dann logisch einprägen können. Aber ich möchte nicht behaupten, daß das die politisch richtige Erklärung ist. Mal schaun, was andere so schreiben.

<FONT COLOR="#a62a2a" SIZE="1">[ 21. Oktober 2001 10:17: Beitrag 3 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...