Zeiger Pointer
-
Für was für Dinge in Programmen benötige ich Zeiger.
Bin für jede Antwort dankbar
-
bin zwar nich so der profi, aber ich wag mal zu sagen: die möglichkeiten von zeigern sind sogut wie unbegrenzt.
1.wenn man einen zeiger als argument einer funktion übergibt, ist das schneller, als der funktion die variable selber zu übergeben.
2.mit einem zeiger in einer funktion kann man variablen andrer funktionen verändern(auch wenn man ziemlich aufpassen muss).und einige bereiche mehr;)
-
Man kann:
-Speicher dynamisch anfordern (ich denke das geht nur mit Zeigern)
-Mehrere Werte durch eine Funktion zurückgeben lassenMfG Max
-
Das bis jetzt genannte trifft auch auf die wesentlich schöneren Referenzen zu. Zeiger brauchst du, wenn du den Wert, auf den der Zeiger zeigt ändern musst.
Beispiel: Eine Klasse Rakete hat als Element einen Zeiger auf ein Ziel. Dieses Ziel kann sich jetzt ändern, du kannst dem Zeiger die Adresse eines anderen Objekts zuweisen. Das geht mit Referenzen nicht.
Und bei new brauchst du Zeiger ebenfalls.
EDIT: Max war schneller, meine Antwort bezieht sich nicht auf Max' Post.
-
Eine andere, wie ich finde, auch gute Erklärung ist:
Frage: Wo steht Dein Auto?
Antwort: Dort. (mit Finger auf das Auto zeigend)Dann bezeichnet Dort, die Stelle wo das Auto steht und der Finger ist in diesem Moment der Zeiger darauf.
-
otze schrieb:
... ich wag mal zu sagen: die möglichkeiten von zeigern sind sogut wie unbegrenzt.
Gut gesagt:)
Noch dazu:
Zeiger ist ein Konzept, mit dem man die Objekte anlegen kann, deren Lebenszeit von dem Programmierer (nicht von dem Compiler) kontroliert werden kann. und viel mehr
EDIT Max war schneller
-
Frage: Wo steht Dein Auto?
Antwort: Dort. (mit Finger auf das Auto zeigend)nach der Erklärung werden Newbies sicher sofort wissen was sie mit Zeigern anfangen können
wesentlich schöneren Referenzen
wieso sind Referenzen schöner?
-
weil du nicht erst dereferenzieren musst.
MfG Max
-
Abgesehen davon, daß Referenzen intern auch dereferenziert werden, stört es find ich nicht im geringsten -> statt . zu schreiben. (Was wohl die häufigste Dereferenzierungsform ist, naja abgesehen von op[] vielleicht)
Außerdem macht die abweichende Syntax viel klarer daß gemeinsamer Speicher genutzt wird.
-
Shady schrieb:
wesentlich schöneren Referenzen
wieso sind Referenzen schöner?
void printDouble(const double& rd) { cout << rd; // no need to test rd; } void printDouble(const double *pd) { if (pd) { // check for null pointer cout << *pd; } }
Das ist ein Ausschnitt aus dem Buch von Meyers.
Na ja Wenn man eine Referenz statt einen Zeiger hat, kann "delete" Operator kaum verwendet werden. Findest du das nicht schoen?
-
daishi schrieb:
Eine andere, wie ich finde, auch gute Erklärung ist:
Frage: Wo steht Dein Auto?
Antwort: Dort. (mit Finger auf das Auto zeigend)Dann bezeichnet Dort, die Stelle wo das Auto steht und der Finger ist in diesem Moment der Zeiger darauf.
Wenn das Auto jetzt ein paar Meter weiter fahr und mann dann wieder mit dem Finger draufzeigt. ändert sich dann die Speicheradresse oder der Wert
-
Das ist sicher auch Geschmackssache. Aber Referenzen wurden nicht zum Spaß eingebaut. Sie sind sicherer, weil man weder die Adresse, auf die die Referenz zeigt, noch die Adresse, an der die Referenz selber steht (WENN sie vom Compiler als Zeiger implementiert wird), absichtlich oder unabsichtlich manipulieren kann.
Für Parameterübergabe ziehe ich Referenzen den Zeigern klar vor.Bronstein schrieb:
Wenn das Auto jetzt ein paar Meter weiter fahr und mann dann wieder mit dem Finger draufzeigt. ändert sich dann die Speicheradresse oder der Wert
Nein, ich finde das Beispiel/Erklärung nicht glücklich gewählt.
-
void printDouble(const double& rd)
{
cout << rd; // no need to test rd;
}void printDouble(const double *pd)
{
if (pd) { // check for null pointer
cout << *pd;
}
}effiziente Parameter-Übergabe (für Lesezwecke) macht man sicher besser mit Referenzen als mit Zeigern. Aber nur weil irgendwas bei einer Sache bequemer ist seh ich nicht ein was daran generell schöner sein soll
-
Wenn das Auto jetzt ein paar Meter weiter fahr und mann dann wieder mit dem Finger draufzeigt. ändert sich dann die Speicheradresse oder der Wert
klingt fast so als ob das eine rhetorische Frage wär um zu zeigen, daß das Besipiel nicht so toll gewählt war
aber ich geh jetzt mal so aus, das das nicht so ist?!
In dem Fall würd sich programmtechnisch der Wert ändern, nämlich die Auto.position. Die Adresse bleibt gleich (im Programm; der Finger müsste sich natürlich bewegen)
-
Zeiger braucht man ueberlicherweise fuer polymorphie( siehe Vererbung) ...
(Achtung, unter polymorphie verstehe ich das man mit einer variable mehrmals Instanzen unterschiedlicher Klassen (abgeleitete) ansprechen kann. Weil, ich bin mir sicher, irgendwer schreibt sicher, das polymorphie auch mit referenzen geht ... )Und fuer dynamisch angelegte Objekte. Dynamische objekte brauchst wiederum, wenn die groese oder anzahl erst innerhalb der laufzeit bekannt wird, oder du groessere Variablen anlegen willst, und ueber den scope der anlegenden funktion hinaus verwenden willst ... ohne die variablen gloabl machen oder zu kopieren.
-
Was ist bei deinem Beispiel eigentlich die Speicheradress und der Wert
-
Shady schrieb:
effiziente Parameter-Übergabe (für Lesezwecke) macht man sicher besser mit Referenzen als mit Zeigern. Aber nur weil irgendwas bei einer Sache bequemer ist seh ich nicht ein was daran generell schöner sein soll
Ich sehe auch beim Schreiben keinen Grund dafür, Werte per Zeiger und nicht als Referenz zu übergeben. Jetzt kommt sicher gleich, weil man dann das bei der Übergabe sieht - WOW. Wenn die Funktion einen geeigneten Namen hat, erkennt man auch, dass sie die Parameter ändert und man sollte sowieso immer dokumentieren, was eine Funktion macht.
IMO sollte man immer, wenn es möglich ist, Zeiger durch Referenzen ersetzen.
-
Optimizer schrieb:
..., erkennt man auch, dass sie die Parameter ändert
man erkennt, dass eine funktion nichts ändert, wenn ihre parameter konstante referenzen sind.
Optimizer schrieb:
und man sollte sowieso immer dokumentieren, was eine Funktion macht.
das sowieso
-
Wie kann man die Speicheradresse um eine int Zahl erhöhen. Bitte mit kurzem Beispiel
-
int *pointer; pointer += 4; // nächstes int
Das sollte man genau NICHT machen. Genau DESHALB sollte man Referenzen verwenden. Wozu soll das gut sein, wenn man nicht gerade nen Grafikkartentreiber schreibt.
-
Knock knock... @Optimizer: Da gehst du aber 16 Byte weiter und nicht bloß 4. Btw. finde ich das im kleinen überschaubaren Rahmen garnicht schlimm ein wenig lowlevel zu werden. Man sollte es nur nicht übertreiben.