Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

odc

Frischling

  • »odc« ist der Autor dieses Themas
  • Private Nachricht senden

1

07.09.2006, 21:35

Referenzen vs. Zeiger

Hallo community,

nach wie vor bin ich in Kapitel 6 gefangen und ich frage mich ganz genau das gleiche, was Heiko im Buch selbst schreibt: "Wenn es Referenzen gibt, wozu brauche ich dann Zeiger?". Allerdings mit einem Unterschied: Ich finde Beispiel 6.5 (mit Zeigern) erheblich leichter zu verstehen als Beispiel 6.8 (mit Referenzen). Die Parameterübergabe von Zeigern generell wurde mir hier letzte Woche anschaulich erklärt, so dass ich keine Probleme mehr habe, dies zu verstehen.
Zeiger sind gut zu mir ;)

Bevor ich mich an ganz konkrete Fragen wage, würde mich interessieren, wer von euch erfahrenen Programmierern mir einen wirklich knackigen Unterschied aufzeigen kann.

Für mich sind Referenzen gewissermaßen Spiegelbilder einer Variablen.
Zeiger sind mehr oder weniger Verweis auf Speicherstellen.
Ist das soweit einigermaßen korrekt?

2

07.09.2006, 22:07

naja, "behing the scenes" sind referenzen nix anderes als zeiger.
Diese mussten aber eingeführt werden in C++, da sonst die ganzen operatorüberladungen und streamoperationen etc nicht funktionieren würden bzw nich so "schön" aussehen würden ;)
zeiger musses aufgrund der rückwärtskompatibilität zu C noch geben.
beim Compilieren gibts dann keinen unterschied

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.09.2006, 22:49

zeig mir eine leere (uninitialisierte) referenz und zeig mir wie man mit referenzen zeiger arithmetik machen kann.

es gibt da doch unterschiede und beide haben ihre berechtigung.
generell würd ich sagen, mit zeigern kannst du alles machen was du auch mit referenzen kannst, umgekehrt aber nicht.
referenzen sind dafür komfortabler, weniger "gefährlich".

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

08.09.2006, 00:05

Wie dot schon sagte, geht es hauptsächlich um "Sicherheit". Wenn du einer Funktion eine konstante Referenz übergibtst, kannst du dir als Anwender der Funktion 100%ig sicher sein, dass jene die übergebenen Variablen nicht verändert. Wenns aber ein Pointer ist, kann man die Speicherstelle auf jene er zeigt verändern so oft man will, egal ob der Pointer const ist oder nicht... weil ja dann nur die Adresse des Pointers (also wohin er zeigt) nicht verändert werden kann...

Edit:
Ansonsten ist es einfach übersichtlicher. Hier zB

C-/C++-Quelltext

1
AufrufIrgendEinerFunktionMitPointerParameter(&MeineVariable);

ist es klar, dass die Funktion den Wert von MeineVariable verändert! (Pointer) Natürlich könnte man das selbe mit Referenzen machen... Ist aber dann nicht mehr so übersichtlich... imo
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

5

08.09.2006, 07:14

Zitat

zeig mir eine leere (uninitialisierte) referenz

das geht per se nich...nachdenken! was aber nicht ausschließt, dass pointer und referenz dasselbe sind...nur halt beim proggen nicht...

Zitat

Wenns aber ein Pointer ist, kann man die Speicherstelle auf jene er zeigt verändern so oft man will

und was is mit:
const int* const a;


ps: glaubt mir doch einfach mal was!

Zitat von »"Bjarne Stroustrup"«

http://www.research.att.com/~bs/bs_faq2.html#pointers-and-references

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

08.09.2006, 07:24

Zitat von »"Black-Panther"«

Wenn du einer Funktion eine konstante Referenz übergibtst, kannst du dir als Anwender der Funktion 100%ig sicher sein, dass jene die übergebenen Variablen nicht verändert.

Leider nicht!
Schau dir das hier an:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void boeseFunktion(const int& x)
{
    int* p_x = const_cast<int*>(&x);
    *p_x = 42;
}

int main(int argc,
         char** pp_argv)
{
    int x = 17;
    boeseFunktion(x);
    printf("%d\n", x);
    return 0;
}

7

08.09.2006, 11:48

Also, soweit ich weiß:
In einem Zeiger ist die Adresse einer variablen gespeichert.
eine Referenz ist die Adresse einer variablen.

ich denke das ist es was odc wissen wollte.

Zeiger sind deswegen besser weil man weniger fehler machen kann.
einer funktion die eine referenz erwartet:

C-/C++-Quelltext

1
2
3
4
void neFunktion (int &wert)
{
    wert++;
}

kann man einfach die variable übergeben

C-/C++-Quelltext

1
2
3
4
5
6
int Wert2 = 0;
neFunktion (Wert2);

/* dann erkennt man keinen unterschied mehr ob man der funktion 
    nun eine variable nur zur verwendung oder zur veränderung 
    übergeben hat.*/


wenn die funktion aber einen zeiger erwartet:

C-/C++-Quelltext

1
2
3
4
void neFunktion (int *wert)
{
     wert++;
}

C-/C++-Quelltext

1
2
3
4
5
//erkennt man sofort das die funktion die variable verändern kann.

int Wert2 = 0;
int *p_Wert2 = &Wert2;

neFunktion (p_Wert2);


das hilft bei der fehlersuche.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

08.09.2006, 12:50

@David
Gut... aber das ist schon eine seeeehr böse Funktion ^^ ;)
Und außerdem ist das imo extrem schlechter Programmmierstil... verwirrt ja nur... (hab ich außerdem noch nie gesehen :D)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

9

08.09.2006, 14:15

Zitat von »"Wabachota"«


wenn die funktion aber einen zeiger erwartet:

C-/C++-Quelltext

1
2
3
4
void neFunktion (int *wert)
{
     wert++;
}


Das aequivalent zur oberen Funktion ware (*wert)++. Deine ist sehr gefaehlich, die laesst wert ja auf eine evetuell garnicht angeforderte Speicherstelle zeigen.
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

08.09.2006, 14:30

schönes beispiel warum es referenzen gibt ;)

Werbeanzeige