Verständnisfragen zu C-Strings bzw char/const char



  • jkljkl schrieb:

    Nein, es ist eben nicht das gleiche. Denn char * ist ein Zeiger, während char [] ein Array ist. Und jetzt sag nicht, das ein Zeiger ein Array ist. Das ist nämlich nicht richtig.

    Eisflamme schrieb:

    "l" ist aber ein const char*, also eine Zeichenkette.

    Ich denke hier liegt das Verständnisproblem. "l" ist nämlich vom Typ const char[] und eben nicht const char*.



  • Oh.



  • Ich glaube "I" ist ein Stringliteral und deshalb vom Typ const char *, wie auch schon in den anderen Beiträgen in diesem Thread erklärt, liegen Stringliterale in einem besonderen Speicherbereich.
    Wie gesagt:
    c = "I" würde ja gehen. Das Problem ist einfach, dass an dieser Stelle *c für ein char steht, und "I" für ein char*.

    Ich muss mich korrigieren, c = "I" würde wahrscheinlich nur dann gehen, wenn c vom Typ const char* wäre, hier ist es aber vom Typ char* - also liegen hier genau genommen zwei Probleme vor.



  • Belli schrieb:

    ...wie auch schon in den anderen Beiträgen in diesem Thread erklärt, liegen Stringliterale in einem besonderen Speicherbereich.

    Bestreite ich nicht.

    Belli schrieb:

    Wie gesagt:
    c = "I" würde ja gehen.

    Stichwort: array-to-pointer decay

    Du kannst ja auch sowas schreiben:

    int values[10];
    int* pvalues = values;
    

    Nachtrag:
    Es gab einen sehr langen thread zu dem ganzen char Zeugs - und krümelkacker hat einen informativen Beitrag dort geschrieben - vielleicht hilft das ja weiter:
    Das verwirrende char in C/C++



  • Wunderbar, Eisflamme aber schrieb, dass *c = "I" nicht geht, weil *c die Dereferenzierung ein char - Pointers ist, mithin ein char, und "I" eine Zeichenkette repräsentiert, wobei es für das Problem hier egal ist, ob const char[] oder const char*.
    Dein

    inter2k3 schrieb:

    Eisflamme schrieb:

    "l" ist aber ein const char*, also eine Zeichenkette.

    Ich denke hier liegt das Verständnisproblem. "l" ist nämlich vom Typ const char[] und eben nicht const char*.

    machte den Eindruck, als wenn Du anderer Meinung seist.



  • inter2k3 schrieb:

    Du kannst ja auch sowas schreiben:

    int values[10];
    int* pvalues = values;
    

    Das ist ja auch was anderes. Hier ging es NICHT um

    char *c = "I";

    sondern um:

    char *c;
    *c = "I";

    und das ist ein Unterschied.



  • Ich denke es sollte klar sein, dass das nicht funktioniert. Dabei spielt es auch überhaupt keine Rolle ob ursprünglich angenommen wurde, dass ein Zeichenkettenliteral vom Typ const char* ist, oder ob es tatsächlich eben vom Typ const char[] ist. Weder das eine noch das andere könnte man einem char zuweisen.

    Ich wollte lediglich klarstellen, welchen Typ ein Zeichenkettenliteral hat.



  • Ok.



  • So erstmal vielen Dank für die Antworten, jetzt is mir das eg schon ziehmlich klar, les mir aber auch mal noch den anderen Thread durch.
    Allerdings bin ich bei einer Sache der Meinung sie wäre falsch:
    'l' ist doch vom typ char und nicht const char oder nicht?

    Lg freeG



  • fr33g schrieb:

    'l' ist doch vom typ char und nicht const char oder nicht?

    Ja. Bei Literalen macht es keinen Sinn, von CV-Qualifizierern zu sprechen, da sie keine eigentlichen Speicherbereiche belegen müssen und nicht adressierbar sind. Skalaren RValues kannst du ohnehin nichts zuweisen.

    Stringliterale wie "hallo" sind ein Spezialfall, wobei auch diese als Arrays nicht konstant sein können (im Gegensatz zu ihren Elementen). Die einzelnen Zeichen besitzen jedoch eine Adresse.



  • Also an alle vielen lieben Dank. Jetzt versteh ich das alles auch wieder richtig und bin nicht mehr so verwirrt wie davor;-)

    Danke, Lg freeG


Anmelden zum Antworten