Unterschied von '0' und "0"



  • FrEEzE2046 schrieb:

    Ja, aber eine Array-Variable ist immer die Adresse auf das erste Element.

    http://www.youtube.com/watch?v=WrjwaqZfjIY



  • Spaß beiseite.

    FrEEzE2046 schrieb:

    Ja, aber eine Array-Variable ist immer die Adresse auf das erste Element. Insofern kann man das - dem Verständnis halber - schon so erklären.

    void* mem = "Hallo";
    for( int i = 0; i < 5; i++ )
    	cout << *(reinterpret_cast<char*>(mem) + i);
    cout << '\n';
    

    Wo gibt es denn da eine "Array-Variable"? Ich sehe keine.

    ...und dass eine "Array-Variable" eine Adresse auf das erste Element "ist", ist mehrfach falsch. Zunächst einmal ist ein Array ein Array und kein Zeiger. Zeiger sind auch keine Adressen -- sie speichern welche.



  • FrEEzE2046 schrieb:

    Ja, aber eine Array-Variable ist immer die Adresse auf das erste Element. Insofern kann man das - dem Verständnis halber - schon so erklären.

    void* mem = "Hallo";
    for( int i = 0; i < 5; i++ )
    	cout << *(reinterpret_cast<char*>(mem) + i);
    cout << '\n';
    

    Der Code ist schonmal kein ISO C++.



  • Implizit ist eine Konstante beginned mit "" immer ein const char* const, somit ein Pointer auf eine Zeichenkette und dadurch eine Adresse.

    krümelkacker schrieb:

    Zunächst einmal ist ein Array ein Array und kein Zeiger. Zeiger sind auch keine Adressen -- sie speichern welche.

    1. Halte ich es für "sehr Intelligent" eine einfache Verständnisproblematik so umständlich zu erklären. Der Denkfehler lag doch ganz wo anders, da kann man die Erklärung auch abstrakt formulieren.
    2. Ist das - in diesem Fall - Erbsenzählerei. "Ein int ist auch keine Ganzzahl, sondern speichert eine" ...

    rüdiger schrieb:

    Der Code ist schonmal kein ISO C++.

    Weshalb?



  • FrEEzE2046 schrieb:

    rüdiger schrieb:

    Der Code ist schonmal kein ISO C++.

    Weshalb?

    Weil die Konvertierung in void* die constness entfernen würde.



  • rüdiger schrieb:

    Weil die Konvertierung in void* die constness entfernen würde.

    Dann packen wir halt noch nen const_cast rum, okay^^



  • FrEEzE2046 schrieb:

    Implizit ist eine Konstante beginned mit "" immer ein const char* const, somit ein Pointer auf eine Zeichenkette und dadurch eine Adresse.

    Erkläre mir mal die Bedeutung von "implizit sein".

    Ein String-Literal ist ein Lvalue-Ausdruck vom Typ const char[N] , wobei N die Zahl der Zeichen des Arrays sind (inklusive Nullterminierung). In einigen Kontexten findet hier "array-to-pointer decay" statt, welches dir einen Zeiger-Wert (RValue) des Typs const char* liefert und nicht const char* const .

    Das hat nichts mit Erbsenzählerei zu tun. Deine Aussage ist einfach falsch. Du hast wegen des "array-to-pointer decay"s den Typ eines String-Literals falsch abgeleitet. Nach Deiner Logik wäre bei folgendem Programm

    template<typename T> void foo(T const& x);
    int main() {
      foo("Gefaehrliches Halbwissen");
    }
    

    der Template-Parameter T = const char* . Ist er aber nicht. Es gilt hier T = char[25] .



  • Ich will gar nicht bestreiten, dass es ein (aus logischer Sicht) anderer Typ ist. Ich sagte nur, dass "letztendlich" (praktisch) ein char[25] trotzdem eine Adresse ist, an der eine 25 Byte Zeichenkette liegt.



  • FrEEzE2046 schrieb:

    Ich sagte nur, dass "letztendlich" (praktisch) ein char[25] trotzdem eine Adresse ist

    Ja, habe ich schon verstanden, was Du sagen willst. Ist aber falsch. Ein Lvalue-Ausdruck, welcher sich auf ein Array bezieht, kann in Kontexten verwendet werden, in denen eine Adresse benötigt wird. Hier findet dann ein automatisches "array-to-pointer decay" statt welches die Adresse (= Wert eines Zeiger-Typs) auf das erste Element liefert. Trotzdem ist ein Array kein Zeiger und auch keine Adresse. Da kannst Du noch soviele Qualifizierer (praktisch, implizit, aus logischer Sicht, letztendlich...) benutzen, das macht Deine Aussage nicht weniger falsch. Es ist auch keine Erbsenzählerei. Im Gegenteil. Ich finde das, was Du da von Dir gibst, unverantwortlich. Der unerfahrene Programmierer könnte Dir ja noch den Unsinn glauben und sich später wundern, warum sizeof(char[25]) != sizeof(char*) gilt, oder warum auf einmal die Template-Argument-Deduction bei Arrays "ganz komisch" funktioniert. Dann kommen wieder Sprüche wie "Ich dachte ein Array sei nur ein Zeiger" etc etc etc. Das Array/Zeiger Thema bereitet Anfängern schon genug Probleme. Da brauchst Du nicht auch noch anfangen, Array=Zeiger oder Array=Adresse zu behaupten.


  • Administrator

    FrEEzE2046 schrieb:

    Ich sagte nur, dass "letztendlich" (praktisch) ein char[25] trotzdem eine Adresse ist, an der eine 25 Byte Zeichenkette liegt.

    Letztendlich ist JEDES OBJEKT nur ein Zeiger auf eine definierte Menge Bytes. Daher ist diese Argumentation völliger Unsinn.

    Grüssli


Anmelden zum Antworten