Verständnisprobleme mitm Pointer auf Stringarrays



  • printf("! z[2]: %s\n", &z[2]);
    printf("! p: p\n", &p);
    

    Wieso will dann das hier nicht funktionieren?



  • Weil &z[2] die Adresse der Stelle ist, an der die Adresse des dritten Strings liegt.
    Weil &p die Adresse der Stelle ist, an der die Adresse des Strings liegt.



  • Ganz kurz nochmal:

    *p ist er Inhalt der Speicherstelle
    &p die Adresse der Speicherstelle
    p die Speicherstelle selbst?



  • noch ne frage schrieb:

    Ganz kurz nochmal:

    *p ist er Inhalt der Speicherstelle
    &p die Adresse der Speicherstelle
    p die Speicherstelle selbst?

    int a = 10;      //a, belegt irgendwo Speicher. Der Speicher wird als int interpretiert und enthält den Wert 10
    int* p_a = &a;   //p_a zeigt auf die Speicherstelle von a (p_a belegt selbst an anderer Stelle Speicher und dieser Speicher wird als Pointer auf int interpretiert)
    *p_a = 50;       //ändert den Wert der Speicherstelle auf den p_a zeigt
    printf("%i\n", a); //Gibt 50 aus
    


  • noch ne frage schrieb:

    Ganz kurz nochmal:

    *p ist er Inhalt der Speicherstelle
    &p die Adresse der Speicherstelle
    p die Speicherstelle selbst?

    Wenn p ein Zeigertyp ist, dann:
    *p ist der Inhalt der Speicherstelle, auf die p zeigt
    p (der Wert) ist die Adresse der Speicherstelle, auf die p zeigt
    &p ist die Adresse der Speicherstelle, an der die Adresse der Speicherstelle steht, auf die p zeigt.

    Da jeder Zeiger (also die Adresse) selbst irgendwo im Speicher stehen muss, kann man auf jeden Zeiger wiederum einen Zeiger bilden.



  • noch ne frage schrieb:

    *p ist er Inhalt der Speicherstelle
    &p die Adresse der Speicherstelle
    p die Speicherstelle selbst?

    wenn du das 'p' aus dem code oben^^ meinst, dann ...
    ... ist p ein pointer, also eine variable, die eine adresse beinhaltet.
    ... ist *p ein zugriff auf die adresse, auf die der pointer zeigt.
    ... ist &p die adresse der pointers selbst.
    🙂



  • mcr schrieb:

    Zu Problem 1:
    Das Geheimnis liegt hier in %s: %s erwartet einen Pointer auf char

    Ahh, so einfach kanns sein. Vielen dank 🙂



  • Demnach müsste doch (belVar *)&p das gleiche sein wie p? Denn &p ist die Adresse des Pointers und mit dem Cast (belVar 😉 greift man auf den Inhalt von &p zu. Oder?



  • noch ne frage schrieb:

    Demnach müsste doch (belVar *)&p das gleiche sein wie p? Denn &p ist die Adresse des Pointers und mit dem Cast (belVar 😉 greift man auf den Inhalt von &p zu. Oder?

    (belVar 😉 &p ist das gleiche wie &p, es hat nur einen anderen Typ. Mit Casts änderst Du nur den Typ eines Ausdrucks. Auf den Inhalt von &p greifst Du mit *&p zu. *&p ist identisch zu p.



  • Ich komme dabei aber noch einer nächsten Frage:

    char z[3][10] = {"das", "istein", "test"}; 
      printf("! z[2]: %s\n", z[2]);
      printf("! z[2]: %s\n", &z[2]);
    

    Also array direkt angelegt, ohne pointer. Der printf-Befehl sieht allerdings genauso aus, und funktioniert auch genauso. Warum ist das offenbar trotzdem ein Pointer, obwohl z anders deklariert wurde? Und warum funktionierte die dritte Zeile genauso?



  • Vielen Dank!



  • noch ne frage schrieb:

    Demnach müsste doch (belVar *)&p das gleiche sein wie p?

    Nein! Es ist derselbe Wert wie &p



  • flowschi schrieb:

    Ich komme dabei aber noch einer nächsten Frage:

    char z[3][10] = {"das", "istein", "test"}; 
      printf("! z[2]: %s\n", z[2]);
      printf("! z[2]: %s\n", &z[2]);
    

    Also array direkt angelegt, ohne pointer. Der printf-Befehl sieht allerdings genauso aus, und funktioniert auch genauso. Warum ist das offenbar trotzdem ein Pointer, obwohl z anders deklariert wurde? Und warum funktionierte die dritte Zeile genauso?

    Noch eine Ergänzung hierzu:

    Kann ich char *z[3] auf jedenfall durch z[3][10] ersetzen (sofern 10 ausreichend sind), und alle andern Befehle und Ausgaben funktionieren noch genauso?



  • flowschi schrieb:

    Ich komme dabei aber noch einer nächsten Frage:

    char z[3][10] = {"das", "istein", "test"}; 
      printf("! z[2]: %s\n", z[2]);
      printf("! z[2]: %s\n", &z[2]);
    

    Also array direkt angelegt, ohne pointer. Der printf-Befehl sieht allerdings genauso aus, und funktioniert auch genauso. Warum ist das offenbar trotzdem ein Pointer, obwohl z anders deklariert wurde? Und warum funktionierte die dritte Zeile genauso?

    Wenn du in C ein Array deklarierst und initialisierst(mit einem Wert belegst), dann macht der Compiler nichts anderes als für die Werte einen zusammenhängenden Speicherplatz zu reservieren und einen Pointer auf den Anfang von diesem Speicherplatz zu setzten.

    (Zusammenhängend heißt: die Speicherstellen, die mit den Werten belegt sind liegen alle strikt beieinander und _nicht_ ein Wert irgendwo im "Anfang" des Speicher und eins am "Ende". )


Anmelden zum Antworten