S
muhi schrieb:
Hallo Leute, also erst Mal danke für die Antworten:
...
Hier meine konkreten Fragen:
Welche arithmetischen Operationen kann man mit Zeigern ausführen?
....
Du solltest andersherum vorgehen: Was willst Du machen ?
Stell' Dir einen Pointer wie Deine Hausnummer vor: Das ist einerseits einfach nur eine Zahl (vgl. int), aber welchen Sinn machen "arithmetische Operationen" auf Deine Hausnummer ? Welchen Sinn bringt es, zwei Hausnummern zu multiplizieren ? ...
muhi schrieb:
...Wenn ich den Wert des Zeigers ändere, ändert sich dann auch der Wert der Variable oder ist der zeiger hier eigentsändiger? ...
Wenn Du die Hausnummer "hast" (= Zeiger dereferenzierst ... mit * oder ->), kannst Du das entsprechende Haus betreten, abreißen, .... was immer das Haus gerade kann, auf das die Hausnummer verweist.
Wenn Du die Hausnummer (= Wert der Zeigervariable) änderst, verweist Du auf ein anderes Haus (= Objekt)... hast mit diesem "Umschwenken" aber weder am alten noch am neuen Haus etwas geändert.
muhi schrieb:
Bei Zeigern kann ich ja mit dem "&" operator (?) auf die Adresse verweisen und sonst auf die variable.
Da hast Du etwas mißverstanden:
- "referenzieren" ("&") bedeutet: "Gib mir die Adresse von diesem Objekt" - das macht nur auf Objekte (damit schließe ich primitive Datentypen mit ein - geht mir nur um den Gegensatz zwiscehn Objekt und Zeiger) Sinn ("Du lässt Dir soz. die Hausnummer geben.")
- "dereferenzieren" ("*" oder "->") bedeutet dagegen, dass Du "das Haus zur Nummer bekommst" .... also aus einem Zeiger das Objekt, auf das er gerade zeigt.
Tricky wird's wenn man bedenkt, dass auch der Wert der Zeigervariable irgendwo im Speicher steht .... damit kann man dann auch die Adresse dieser Zeigervariablen herausbekommen (soz. "die Hausnummer des Zettels, auf dem die Hausnummer steht" ;)) .... aber hier kommen wir an die Grenze der Analogie.
muhi schrieb:
Wo ist der genaue Nutzen(vorteil) von refs gegenüber zeigern??
Vielen Dank
Eine Referenz sagt einfach was Anderes aus: Sie hat selbst keine Adresse und MUSS auf etwas zeigen (dass man eine Referenz auch ungültig machen kann, weiß ich auch ... darum geht's hier aber nicht".
Auch hier wird andersherum ein Schuh draus: Mit einem Datentypen sagst Du etwas aus (sonst könnte man alles void* definieren):
int i; // Bedeutung: In i sollen nur Zahlen aus N (in bestimmten Grenzen) abgelegt werden
std::string s; // Bedeutung: Hier sollen Zeichenketten rein
int& ref_i = i; // Bedeutung: Dies Ding soll ein Alias für i sein. Alles, was für i gilt, gilt auch für ref_i und andersherum
std::string* ptr_s; // Bedeutung: Dieses KANN zwischendurch auf einen string zeigen
....
Je nach zu programmierender Fachlichkeit ergibt Jedes seinen Sinn.
Ein "Alias" ist z.B. sinnvoll, wenn eine Hutgröße verändert werden soll:
void erhoeheZahl(int& zahl) {
// Hier ist total egal, was die Zahl dem Aufrufer bedeutet;
// für uns ist es einfach "eine Zahl"
zahl += 1;
}
int main(void) {
int hutgroesse; //Hier soll augenscheinlich eine Hutgroesse abgelegt werden
hutgroesse = 3;
erhoeheZahl(hutgroesse); // ICH will, dass diese Hutgroesse als Zahl betrachtet und erhoeht wird
// implizit mache ich hier "zahl = hutgroesse;" Da zahl eine Referenz ist (und nicht etwa selbst ein int),
// sorge ich dafuer, dass alles, was in erhoeheZahl() ebenfalls mit hutgroesse passiert
...
Gruß,
Simon2.