char



  • Hallo

    Unterschied

    char x[5]="Affe";
    
    char* y="Affe";  
    
    cout<<y++; // Ausgabe f
    
    cout<<x++; // Fehler !
    


  • Hallo

    Array Zeiger



  • blurry333 schrieb:

    [...]alle Posts zusammen[...]

    Nichts für ungut, aber wie wäre es mal mit einem ordentlichen Buch?



  • sollte "y++" nicht "Affe" ausgeben?



  • Wenn du ein Zeiger auf char mit einem Stringliteral initialisierst, dann macht ein const char*, denn du kannst ein Stringliteral nicht ändern, führt dann zu nem Laufzeitfehler, also lieber gleich ein const char* draus machen.

    Gruß freeG



  • fr33g schrieb:

    Wenn du ein Zeiger auf char mit einem Stringliteral initialisierst, dann macht ein const char*, denn du kannst ein Stringliteral nicht ändern, führt dann zu nem Laufzeitfehler, also lieber gleich ein const char* draus machen.

    Gruß freeG

    Ich denke Tachyon hat eigentlich schon alles gesagt. Da braucht eigentlich niemand mehr was dazuschreiben.

    Aber Du hast natürlich recht. Wie hat hier jemand so schön geschrieben: Wenn ein Stringliteral an ein char-pointer übergeben wird, stirbt jedesmal ein süßes Kätzchen.

    mfg Martin



  • int main()
    {
    char x[5]="Affe"; 
    
    char* y="Affe";   
    
    y[2]='B';  // führt zu unbehandelter Ausnahme 
    
    x[2]='B';
    }
    

    also char* x ist dasselbe wie const char* x.
    Warum wird dann nur zur Laufzeit ein fehler erzeugt ?
    Und wieso kann man es nicht ändern. Welcher Sinn steckt dahinter ?



  • blurry333 schrieb:

    Welcher Sinn steckt dahinter ?

    Tja, ohne Buch wird sich Dir der Sinn wohl nicht erschließen.
    Sagte schon wer, daß Du erstaunliche Ähnlichkeiten zum User Sebastianfox hast?



  • Hallo blurry333,

    schreib so etwas doch in c Forum,
    da wird dir bestimmt geholfen ...

    Gruß Frank



  • Der Standard sagt, ein String-Literal zu verändern, erzeugt undefiniertes Verhalten. Das gibt dem Compilerbauer die Freiheit, folgende Optimierungen einzubauen:

    1. gleiche Stringliterale können zusammengelegt werden.
    2. Stringliterale können in schreibgeschützte Speicherbereiche gelegt werden

    Dass man darauf mit einem nicht-konstanten char-Zeiger verweisen kann, hat Kompatibilitätsgründe. In C ist es halt so. Verändern darf man die Stringliterale da aber auch nicht.



  • Frank Erdorf schrieb:

    schreib so etwas doch in c Forum,
    da wird dir bestimmt geholfen ...

    Die werden sich fragen, was cout ist und warum es um y++ geshiftet werden soll ...



  • char x[5]="Test";

    ich dachte mal x ist auch ein zeiger 😞



  • blurry333 schrieb:

    ich dachte mal x ist auch ein zeiger 😞

    x kann (implizit) in einen Zeiger konvertiert werden, ist aber ein Array.



  • Eigentlich ist x ein zeiger auf x[0], oder?

    lg, freakC++



  • Und zum Beispiel mit dem Affen:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char x[5]="Affe"; 
    	char* y = x;
    
    	cout << *(y+1);
    
    	return 0; // ;)
    }
    

    Da hast Du dein "f".
    lg, freakC++



  • freakC++ schrieb:

    Eigentlich ist x ein zeiger auf x[0], oder?

    lg, freakC++

    liest du auch manchmal antworten?



  • Eigentlich schon? Hab ich was überlesen 😃 :D?

    lg, freakC++

    PS.: Ich lese sie besser nochmal!

    edit: Meinst Du die Antwort von drakon? Ich wollte hervorheben, dass es ein Zeiger auf x[0] ist!?! Nunja, ich möchte nicht unangenehm auffallen 🙄 - sry



  • freakC++ schrieb:

    Eigentlich schon? Hab ich was überlesen 😃 :D?

    lg, freakC++

    PS.: Ich lese sie besser nochmal!

    edit: Meinst Du die Antwort von drakon? Ich wollte hervorheben, dass es ein Zeiger auf x[0] ist!?! Nunja, ich möchte nicht unangenehm auffallen 🙄 - sry

    x lässt sich in einen Zeiger auf x[0] konvertieren ja, aber er ist es nicht von Anfang an. Das siehst du am unterschiedlichen Verhalten, wenn du einen Zeiger inkrementierst und wenn du versuchst ein Array zu inkrementieren. Du wirst einen grossen Unterschied feststellen und dir beweisen, dass es nicht das gleiche ist.



  • blurry333 schrieb:

    char x[5]="Test";

    ich dachte mal x ist auch ein zeiger 😞

    Mal ein paar basics:

    type *x;
    

    Das deklariert einen Zeiger. Der Inhalt der Variable ist eine Adresse.

    type x[10];
    

    Das deklariert ein Array mit 10 Elementen. x alleine ist kein Zeiger sondern eine Adresse.

    type x( type *ptr ];
    

    Hiermnit deklariert Du eine Funktion, die als einzigen Parameter eine Adresse haben will. ptr ist dann eine lokale Zeigervariable, die beijm Aufruf der Funktion die übergebene Adresse zum Inhalt hat.

    Aufgerufen werden kann sie so, indem Du ihr eine Adresse oder den Inhalt einer Zeigervariable übergibst:

    type array[19];
      type *pointer = array;
    
      x( array );     // übergabe einer adresse
      x( pointer );   // übergabe des Inhalts eines Zeigers
    

    Das ist der Grund weshalb viele meinen array und pointer sei das gleiche, Falsch!!!!!

    mfg Martin



  • @drakon: Zitat aus dem Buch "C++ lernen und professionell anwenden".

    char stadt[] = "München";
    

    "Dann ist stadt ein char-Zeiger auf stadt[0]..."

    Vielleicht verstehe ich das falsch oder mein Buch hat einen Fehler. Deine Antwort ist aber eigentlich einleuchtend.

    edit:
    Ich habe jetzt auch gerade mal eine Frage:

    char* x = "Affe";
    cout << x << endl;
    

    x ist ein Zeiger, der laut meines Buches auf das erste Element eines Arrays zeigt und somit auf "A" zeigen müsste. Wenn ich jedoch x ausgebe, dann wird "Affe" ausgegeben und nicht "A". Warum? Das wurde zwar schon teilweise besprochen, doch das ist mir auch nicht klar.

    Könnt ihr mir da helfen?

    Dankeschön!

    lg, freakC++


Anmelden zum Antworten