Grundlagen: Array und sein Inhalt

  • Grundlagen: Array und sein Inhalt

    Warum bekomme ich den Rest von einem String, wenn ich die Speicheradresse von einem Inhalt holen möchte?

    Quellcode

    1. char text[] = "Hallo";
    2. cout << text << ": " << &(text) << endl;
    3. int i;
    4. for(i=0; i<strlen(text); i++)
    5. {
    6. cout << *(text+i) << ": " << &text[i] << endl;
    7. }


    Ausgabe:

    Quellcode

    1. Hallo: 0x22ff7c
    2. H: Hallo
    3. a: allo
    4. l: llo
    5. l: lo
    6. o: o


    Warum so?
    Aus macfreakz wurde Apfelbeisser …
  • RE: Grundlagen: Array und sein Inhalt

    Weil Du mir der eckigen Klammer dereferenzierst. Mit dem & holst Du Dir von dem Wert an der Speicherstelle wieder die Adresse und cout gibt nun den rest des Strings bis zu einem '\0' Byte aus, da cout, aehnlich wie printf mit "%s" eine Adresse verlangt.
    Das "&text" ist genau das gleiche wie ein "text". Bei "text" nimmt der Compiler eine Adresse an und bei "&text[i]" auch, nur, dass Du hier die Anfangsadresse festlegst.

    Gruss,
    Manfred
  • nein,

    Quellcode

    1. printf("%#x\n", &text[i] );


    das kann nicht richtig sein,
    sie gibt die gleiche Adressen aus
    wenn ich zweite Variable namens text1 anlege
    und die gleiche print zeile hinzufüge und
    den Variablennamen anpasse.

    Momentmal ...

    das war eine Optimierung vom Compiler,
    wenn der Inhalt anders ist, dann sind die Adressen anders.

    Schlau, was?
    Aus macfreakz wurde Apfelbeisser …
  • Der printf schaut auf den Format-String. Dort steht Zahl. Also wird der Wert als Zahl (Adresse) intepretiert. Würdest du %s hereinschreiben, würde es wieder als String interpretiert.

    Dein <<-Ausdruck hat keinen Formatstring. Er unterscheidet nach dem Parameter. Dieser ist ein char*, was ihn veranlasst zu denken: Dat ess ne String. Du musst ihm klar machen, dass es kein String ist: Casting.

    So oder so ähnlich jedenfalls.

    BTW: C++ ist Crap.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Dein <<-Ausdruck hat keinen Formatstring. Er unterscheidet nach dem Parameter. Dieser ist ein char*, was ihn veranlasst zu denken: Dat ess ne String. Du musst ihm klar machen, dass es kein String ist: Casting.


    Ja, genau! So können die Speicheradressen per cout ausgegeben werden.

    Quellcode

    1. cout << *(text+i) << ": " << (void*)(&text[i]) << endl;


    Sehr schön.

    BTW: C++ is Crap. Ja, bin auch der Meinung 8)
    Aus macfreakz wurde Apfelbeisser …
  • So viel zum Thema Überladen und Klarheit in der Source. Da lobe ich mir doch named Parameters.
    Am besten man druckt sich das aus und hängt es sich an die Wand. Nur als Warnung:

    Dieser Crap nennt sich C with classes^W^W^WC++!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ist mir schon klar. Deshalb meinte ich ja auch "nicht einmal dafür".

    Das sind meist die Leute, die schon wissen, wo sie Laufzeitverhalten benötigen, wenn sie @interface eingeben. Außerdem sorgt das natürlich auch für Brustbehaarung.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?