Das verwirrende char in C/C++



  • Das weiß ich nicht, kommt auf die Frage an! Welche Frage meinst du?


  • Administrator

    Decimad schrieb:

    Das weiß ich nicht, kommt auf die Frage an! Welche Frage meinst du?

    Lies die Funktionsnamen.

    Grüssli



  • Boah, ich hab jetzt echt keine Lust hier groß auszuholen, warum ich mir das so vorstelle. Mir reicht jetzt hier zu betonen, dass eine Vorstellung nicht der Wirklichkeit entsprechen muss.



  • Irgendwo hier im Forum hatte ich zu einem ähnlichen Thema gelesen, dass ein Byte auf unterschiedlichen Maschinen nicht gleich groß sein soll.

    Wie auch immer, man könnte coden:

    char Weihnachtskalender[24]
    

    irritierenderweise könnte man aber auch coden:

    char *Weihnachskalender[24]
    

    Das ist beides nicht das gleiche, das erste eher ein der Weihnchtskalender selbst (vorerst eine Bastelarbeit, noch keine Schokolade drin 😞 ) - das letztere gleicht eher dem Kind, welches auf den Kalender guckt, und sieht: Ah, heut ist der 22. also mach ich Tür 22 auf - nur das es im Moment noch schläft, und noch gar nicht weiß, was für ein Tag heute ist...;)

    ...hm und um die Verwirrung noch etwas anzuheizen, könnte man ja meinen, der Kalender selber heisst i++ ...und nicht etwa ++*gierigegrabbelhand - dann eher vielleicht ++*datum 🤡

    http://www.c-plusplus.net/forum/276143



  • Das Hauptptoblem hier ist doch wie Dravere schon gezeigt hat, das aneinander vorbei geredet wird. Ein Array ist ein Array und ein Pointer ist ein Pointer. Aber ein Array kann durch Pointersyntax angesprochen werden, das ist doch alles...



  • Dravere schrieb:

    #include <iostream>
    
    bool isAnArrayAPointer()
    {
      return sizeof(int[10]) == sizeof(void*);
    }
    
    bool isTheNameOfAnArrayAPointer()
    {
      int temp[10];
      return sizeof(temp) == sizeof(void*);
    }
    
    int main()
    {
      std::cout << std::boolalpha << isAnArrayAPointer() << std::endl;
      std::cout << std::boolalpha << isTheNameOfAnArrayAPointer() << std::endl;
    }
    

    Frage beantwortet? 😉

    Grüssli

    Das macht doch 0 Sinn, mein Pointer verbraucht doch nicht mehr Speicher wenn er auf eine größere Datenstruktur zeigt, insofern trägt der Vergleich ob sizeof(array) == sizeof(pointer) Null zur Diskussion bei, egal welcher Meinung man auch sein mag.



  • gastantwort schrieb:

    Das macht doch 0 Sinn, mein Pointer verbraucht doch nicht mehr Speicher wenn er auf eine größere Datenstruktur zeigt, insofern trägt der Vergleich ob sizeof(array) == sizeof(pointer) Null zur Diskussion bei, egal welcher Meinung man auch sein mag.

    Es zeigt den Unterschied Array <-> Zeiger.
    Und das ein Array eben kein Zeiger ist.

    Beide Vergleiche sind btw unwahr.

    PS:
    Es geht hier nicht um Meinung. Dass ein Array kein Zeiger ist, ist einfach ein Fakt.



  • Shade Of Mine schrieb:

    Es zeigt den Unterschied Array <-> Zeiger.
    Und das ein Array eben kein Zeiger ist.

    Es zeigt eigentlich nur, dass es nicht exakt das gleiche ist. Dass der Unterschied fundamental und nicht nur eine willkürliche Definition ist zeigt es nicht. Mich würde man so jedenfalls nicht überzeugen können.



  • Bashar schrieb:

    Es zeigt eigentlich nur, dass es nicht exakt das gleiche ist. Dass der Unterschied fundamental und nicht nur eine willkürliche Definition ist zeigt es nicht. Mich würde man so jedenfalls nicht überzeugen können.

    Was würde für dich einen fundamentalen Unterschied bedeuten?



  • Warum sollte ein Array ein Zeiger sein? Da könnte auch eine Klasse ein Zeiger sein. Oder eine Referenz eine Klasse. :xmas2:



  • wxSkip schrieb:

    Eines interessiert mich jetzt aber doch noch. Wie soll alloca() funktionieren?

    Anhand der angeforderten Speichergröße wird der Platzbedarf auf dem Stack ermittelt, der Stackpointer entsprechend abgeändert und die Adresse auf dem Stack für den angeforderten Block übergeben.

    Exakt das gleiche passiert bei einem Array. Der einzige Vorteil bei einem Array ist, daß der Compiler weiß wie groß es ist. Das war's dann aber auch schon an Unterschieden.



  • huüh schrieb:

    Da könnte auch eine Klasse ein Zeiger sein.

    Eine Iterator-Klasse ist eine Abstraktion eines Zeigers.



  • ~john schrieb:

    wxSkip schrieb:

    Eines interessiert mich jetzt aber doch noch. Wie soll alloca() funktionieren?

    Anhand der angeforderten Speichergröße wird der Platzbedarf auf dem Stack ermittelt, der Stackpointer entsprechend abgeändert und die Adresse auf dem Stack für den angeforderten Block übergeben.

    Exakt das gleiche passiert bei einem Array. Der einzige Vorteil bei einem Array ist, daß der Compiler weiß wie groß es ist. Das war's dann aber auch schon an Unterschieden.

    🙄
    Ich habe doch unten genau hingeschrieben, was ich daran nicht verstehe, und das ist auch schon beantwortet worden...



  • ~john kapiert mal wieder nicht um was es geht.



  • ~john schrieb:

    huüh schrieb:

    Da könnte auch eine Klasse ein Zeiger sein.

    Eine Iterator-Klasse ist eine Abstraktion eines Zeigers.

    Lern lesen.



  • wxSkip schrieb:

    Ich habe doch unten genau hingeschrieben, was ich daran nicht verstehe, und das ist auch schon beantwortet worden...

    🙄
    Und mir war es wichtig diesen Punkt nochmals zu vertiefen. Es ist nun einmal so, daß viel zu viele nicht wissen, was wirklich in C und C++ mit simplen Arrays passiert. Zur Laufzeit unterscheidet sich ein Array gar nicht von einem Zeiger auf speziell allozierten Speicher. Der Compiler kann während der Übersetzung an Hand des Typs eines Arrays mit fester Größe dessen Größe anderen Orts wiederverwenden. Zur Laufzeit fehlen diese Informationen vollständig.

    Das Resultat dieses Unwissens ist es, daß es am laufenden Band Probleme mit Arrays gibt. Man muß sich nur die unzähligen buffer overflows wieder ins Gedächtnis rufen, die immer wieder zusammen gecodet werden.



  • ~john schrieb:

    Und mir war es wichtig diesen Punkt nochmals zu vertiefen. Es ist nun einmal so, daß viel zu viele nicht wissen, was wirklich in C und C++ mit simplen Arrays passiert. Zur Laufzeit unterscheidet sich ein Array gar nicht von einem Zeiger auf speziell allozierten Speicher. Der Compiler kann während der Übersetzung an Hand des Typs eines Arrays mit fester Größe dessen Größe anderen Orts wiederverwenden. Zur Laufzeit fehlen diese Informationen vollständig.

    Zur Laufzeit kannst du ja auch nicht sizeof(int) abfragen. Es gibt doch einen Unterschied, nämlich dass bei einem Array kein Pointer auf dem Stack liegt, sondern nur das Array selbst. Dessen Adresse kann nämlich durch den Stack-Pointer bestimmt werden, um dann in einen Pointer geschrieben zu werden. Das ist eine Verständnisfrage. Ein Array unterscheidet sich auch zur Laufzeit von einem Pointer auf speziell allozierten Speicher, da ein Array der speziell allozierte Speicher ist.
    Ganz nebenbei willst du meine Antwort korrigieren und dabei deine Meinung vertiefen, dabei gehst du gar nicht direkt auf sie ein. Was soll das?



  • ~john schrieb:

    Zur Laufzeit unterscheidet sich ein Array gar nicht von einem Zeiger auf speziell allozierten Speicher.

    Doch. Ein Zeiger ist eine Variable, die eine Adresse enthält. Wenn du dasselbe mit einem Array formulierst, dann gibt es diese Variable nicht, das Array ist einfach nur die Ansammlung seiner Elemente.

    So könnte man es sagen: Ein Array ist speziell allozierter Speicher. Aber ich glaube das weiß eh jeder.



  • Bashar wird es dir nicht langsam leid, die Fehler der anderen zu verbessern?



  • Jetzt sind es schon 8 Seiten Diskussion ´for notting´ - wie viele noch? 😕


Anmelden zum Antworten