steckl: Wie komisch ist das denn?

Beitrag lesen

Hi,

Anschauungsbeispiel:

f == &f[0] == f+0
&f[5] == f+5
f[0] == *(f+0)    // +0 kann natürlich auch weggelassen werden
f[5] == *(f+5)
//jetz wirds abstrakt und theoretisch (das wirst du hoffentlich nie so vorfinden), aber es geht noch weiter:
== *(1+f) == 1[f]

Hm, coole Sache. Ich gehe mal davon aus, dass bei Dir auch 1[f]==f[1]? Ist das nur dadurch begründet, dass 1[f]=1+f <font color="red">!==!</font> f+1==f[1], um wenigstens die Kommutativität des "+"-Operators zu wahren, oder steckt noch eine andere teuflische Logik dahinter? :-)

Sorry, da hab ich die 1 mit der 5 vertauscht, also so muss es korrekt heißen:
f[5] == *(f+5) == *(5+f) == 5[f]
Aber ich kann mir aber keinen Fall vorstellen, wo es Sinn machen würde die letzten beiden Schreibweisen zu verwenden.
Es funktioniert, damit die Rechengesetze alle eingehalten werden. "f+5" ist ja das gleiche wie "5+f". Und f[5] ist laut Definition das gleiche wie *(f+5). Und damit ist auch "*(5+f)" das gleiche wie 5[f].

Die Schreibweise mit f+1 hat den Vorteil, dass der ursprüngliche Pointer erhalten bleibt, was auch das Problem, das du hattest mit der Abarbeitungsreihenfolge der Argumente, beseitigt.

Okay, aber nur aufgrund dieser Tatsache will ich Dir jetzt Recht zugestehen :-). Ansonsten finde ich ++ einfach eleganter und korrekterer.

Bis auf das Problem mit der Abarbeitungsreihenfolge ist es wohl hier echt ziemlich egal. Ich kann mir auch nicht vorstellen, dass eine der beiden Methoden viel Performanter ist als die andere.

Ich habe immer noch nicht ganz verstanden, wann man jetzt Variablen var durch "&var" und wann als "*var" deklarieren muss!? Mit google ist ohne Kenntnis der genaueren Suchsyntax ja nichts zu machen bei solchen Zeichen, finde leider nix.

Das ist ein äußerst wichtiges Thema in C/C++ und sollte daher eigentlich in jedem guten Tutorial/Buch ausführlich erklärt werden.

Aber hier mal ein kurzer Erklärungsversuch:
&var brauchst du bei der Deklaration (Anlegen von Variablen) nie, erst bei der Initialisierung (Wertzuweisung).

int var1 = 4;     // legt eine normale Variable an und initialisiert sie mit 4  
int* ptr = &var1; // legt einen int-Pointer (=Zeiger) an und initialisiert ihn mit der Adresse von var1  
var1 = 2;         // setzt var1 auf 2  
*ptr = 5;         // setzt die Variable, auf die ptr zeigt (in diesem Fall var1) auf 5  
// hier hat var1 den Wert 5 (und nicht 2)

Ich mach das immer manuell: (code lang=C++)bla bla bla (/code)
nur mit eckigen statt runden klammern. Einen extra-Knopf gibt es dafür nicht, weil C++ hier vielleicht zu selten vorkommt und ausserdem in der Webprogrammierung ja nicht so häufig verwendet wird.

Sehr gut. Nur für den Fall, dass solche Themen hier im Sinne der Übersichtlichkeit des Forums nicht 100% erwünscht sind (bin hier trotzdem gerne, weil die Leute immer so schön diskutieren :),

Es sollte eigentlich niemanden stören, wenn du hier postest, solange du dich an die Forumsregeln hältst.

und Du ja C++mäßig sehr bewandert scheinst, wo würdest Du mich hinschicken?

Ich hab noch nie nach einem guten C++-Forum gesucht. Da ich Informatik studiere kann ich mich mit Problemen normalerweise an meine Kommilitonen oder Dozenten wenden. Wenn mal gerade keiner in der Nähe ist frage ich auch hier nach. Hier erhält man auch immer schnell Hilfe.
Außerdem beherrsche ich C++ auch noch nicht so richtig, sondern nur die Grundlagen.

mfG,
steckl