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

MaxDeus

Frischling

  • »MaxDeus« ist der Autor dieses Themas

Beiträge: 2

Wohnort: NRW

Beruf: Student

  • Private Nachricht senden

1

18.03.2016, 15:16

Verständnishilfe für zeiger und Referenzen

Hallo miteinander.
Damit ich beim Programmieren keine Fehler mache, wollte ich hier mal eine Frage stellen.
Habe vor kurzem die Möglichkeit mit Zeigern und Referenzen zu arbeiten kennengelernt und frage mich folgendes: Was genau bringt das überhaupt?

Mein Beispielprogramm:
...
void func_a( int i )
{i += 3;}
void func_b( int& i )
{i += 3;}
void func_c( int∗ i )
{∗i += 3;}
...
func_a( a );
func_b( a );
func_c( &a );
Hier habe ich die drei Varianten mal eingesetzt, also normale Variable, Referenz und dann Zeiger.
Beim erstem übergibt er ja nichts, wegen dem Typ "void", daher ändert sich i auch nicht, bleibt 3. Beim zweiten ändert sich i um 3 und wird dann i_alt+3. Doch was ergibt die dritte void?
Und warum sollte ich eine void verwenden und auch Zeiger bzw. Referenzen, wenn ich mir mit einer int-Funktion die Zeiger sparen kann? Dann habe ich einfach eine globale Variable, die ich veränder und nicht Zeiger, die auf eine Variable zeigen. :huh:
Danke euch schon mal für die Hilfe.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.03.2016, 16:15

Versuch doch mal eine Swap Funktion zu schreiben. Du hast zwei Int Variablen und möchtest deren Werte tauschen. Quasi:

C-/C++-Quelltext

1
2
int a = 42;
int b = 1337;

Du möchtest beide Werte tauschen, also sowas wie:

C-/C++-Quelltext

1
2
3
int temp = a;
a = b;
b = temp;

Jetzt willst du das ganze aber in eine Funktion auslagern damit du nur noch folgendes schreiben musst:

C-/C++-Quelltext

1
swap(a, b);

Nach dem Aufruf sollen die Werte von a und b getauscht werden. Mit deinem Rückgabetyp kommst du nicht weit da du ja immer nur eine Sache zurück geben kannst. Jetzt überleg noch mal wie du mit Referenzen bzw Zeigern daran gehen könntest.
Besser eignen sich hier Referenzen. Der Unterschied zwischen beiden ist dass Referenzen niemals null sein dürfen, Zeiger aber schon. Falls du noch keine Klassen kennst ist der unterschied noch nicht relevant für dich. An sich kann man sagen, wenn du dir nicht sicher bist nimm eine Referenz. Wenn du einen Zeiger brauchst dann wirst du dir da im Normalfall sicher sein.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

MaxDeus

Frischling

  • »MaxDeus« ist der Autor dieses Themas

Beiträge: 2

Wohnort: NRW

Beruf: Student

  • Private Nachricht senden

3

18.03.2016, 16:35

Okay, also kann ich mir das so vorstellen.
Selbst wenn ich keine Werte übergebe kann ich mithilfe von Zeigern die Werte von Variablen global ändern (bzw. mit Referenzen).
Mit Ref wäre der Swap dann:

C-/C++-Quelltext

1
2
3
4
5
6
void swap (int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}

Dann würden keine Werte übergeben (durch void ja auch gar nicht möglich) und dennoch habe ich die Variablen geändert.

4

19.03.2016, 00:00

Die Thematik hast du verstanden, allerdings wirfst du Begriffe durcheinander.

Selbst wenn ich keine Werte übergebe kann ich mithilfe von Zeigern die Werte von Variablen global ändern (bzw. mit Referenzen).

Du übergibst immer noch Werte nur sind das jetzt Adressen (call by reference) anstatt der eigentlichen Zahlenwerte (call by value).
Desweiteren änderst du die Variable nicht zwangsläufig global (dazu müsste sie global sein), du änderst sie in einem anderen Gültigkeitsbereich (außerhalb der Funktion).

Dann würden keine Werte übergeben (durch void ja auch gar nicht möglich) und dennoch habe ich die Variablen geändert.

Void ist der Rückgabewert der Funktion, dass beeinflusst nicht ob der Funktion beim Aufruf Werte übergeben werden können.

Und nun noch ne Klugscheißerlösung :)

C-/C++-Quelltext

1
2
3
4
5
6
void swap(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

19.03.2016, 06:35

Die Klugscheißerlösung geht noch kürzer (^=) und funktioniert leider nur für integrale Typen und ist für das Referenz-Verständnis hier wenig hilfreich ;)

PS:
Es gibt auch noch std::swap
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

19.03.2016, 13:45

PS:
Es gibt auch noch std::swap

Natürlich gibt es das aber hier ging es ja einfach um ein Beispiel zu Referenzen und Swap finde ich immer recht einleuchtend und leicht verständlich.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

19.03.2016, 22:10

Das war mir schon bewusst... das steht ja schließlich auch in meinem letzten Beitrag.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige