2 Variablen zurückgeben aus Rekursiver Funktion

Schnelle objektorientierte, kompilierende Programmiersprache.
DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von DANrulz81 » Mi Jan 11, 2012 1:01 pm

O.k. Danke schonmal. Wieso kann ich dann nicht einfach

Code: Alles auswählen

zeiger++
machen?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von Xin » Mi Jan 11, 2012 1:13 pm

cloidnerux hat geschrieben:

Code: Alles auswählen

*zeiger++;  //Ohne klammern
*(zeiger++); Variante A
(*zeiger)++;  //Variante B
Beim ersten wird der Die Speicheradresse des Zeigers erhöht, beim zweiten den Inhalt der Variable auf die gezeigt wird. Wahrscheinlich wird der Compiler Variante B wählen, da ich mir aber nicht sicher war, hab ich eben die Klammern genutzt um es zu verdeutlichen.
http://www.proggen.org/doku.php?id=c:expr:opprio
++ Operator hat Priorität 14, Dereferenzieren auch.
Urpsrünglich dachte ich, dass die Frage einfacher zu beantworten wäre ^^
Die Tabelle habe ich aus einem Buch abgeschrieben, da sollte man vielleicht nochmal mit dem Standard gegen an.

Bleibt also das bekannte Copy-String, was als unverständliche Zeigervergewaltigung bezeichnet wird (auch weil die Klammern fehlen), aber genau hier als Eselsbrücke hilft.

Code: Alles auswählen

void copy_string( char* dest, const char* src ) 
{
  while ( *dest++ = *src++ );
}
Der Zugriff von dest (*dest) und anschließende hochzählen des Ergebnisses (++) würde vom Typ ein (char const) ergeben, nämlich die Zahl, die eins höher ist als das was in (*dest) steht. Eine Zahl kann nicht überschrieben werden.

Ziel der Sache ist, es eine Reihe von Speicherzugriffen hintereinanderliegender Adressen zu machen. ++ kommt also zuerst: *dest++ entspricht also *(dest++).

Noch eine Eselsbrücke. dest++ ist gleichwertig mit ++dest, entsprechend sollte *++dest sich ebenso verhalten wie *dest++. Daraus folgt, dass Prä- wie Postfix Operatoren von ++ stärker binden als der Dereferenzierungsoperator *.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von DANrulz81 » Mi Jan 11, 2012 1:24 pm

Das bedeutet dann, dass erst

Code: Alles auswählen

zeiger
,also die Adresse, inkrementiert wird, und dann

Code: Alles auswählen

zeiger
dereferenziert wird, was zur Folge hätte, dass der Zeiger jetzt auf einen um 1 höheren Speicherbereich zeigt?
Zuletzt geändert von DANrulz81 am Mi Jan 11, 2012 1:27 pm, insgesamt 1-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von Xin » Mi Jan 11, 2012 1:26 pm

Yepp: wie gesagt, *dest++ entspricht *(dest++).
*zeiger++ war also nicht, was Du brauchtest, sondern (*zeiger)++
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von DANrulz81 » Mi Jan 11, 2012 1:28 pm

Also

Code: Alles auswählen

*(dest++)
entspricht Adressinkremt und

Code: Alles auswählen

(*dest)++
Dereferenzierungsinkrement.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 2 Variablen zurückgeben aus Rekursiver Funktion

Beitrag von Xin » Mi Jan 11, 2012 2:16 pm

DANrulz81 hat geschrieben:Also

Code: Alles auswählen

*(dest++)
entspricht Adressinkremt und

Code: Alles auswählen

(*dest)++
Dereferenzierungsinkrement.
Wenn man auf die Kombination komplizierter Worte steht, dann ja. ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten