int-Pointer bei Ausgabe derefenzieren, aber char-Pointer nicht!?



  • Hallo,

    also mir ist eben was aufgefallen:

    int *c=(int*)malloc(sizeof(int*));
    char *pw = (char*)malloc(sizeof(char*));
    
    *c = 1; /* geht */
    *pw = "Test"; /* geht nicht */
    pw = "Test"; /* geht */
    
    printf("pw=%s", pw); /* geht */
    printf("pw=%s", *pw); /* geht nicht */
    

    Warum muss ein char-Pointer bei Ausgabe, Zuweisung nicht derefenziert werden?

    Danke

    Gruß

    [C mit VS C++, kein C++]



  • Weil *pw ein char ist und pw ein Zeiger.

    Bei pw = "Test" wird in pw die Adresse gespeichert in der das T gespeichert ist.
    (pw zeigt auf T)
    *pw ist der Inhalt der Speicherstelle auf die pw zeigt.

    und printf erwartet bei %s einen Zeiger.



  • Vergessen:

    *pw = 'T';
    

    denn ein char kann halt nur ein Zeichen Speichern und nicht 5 wie bei "Test"

    und bei printf musst du dann halt auch angeben das du ein Zeichen ausgeben willst.
    Mit %c wenn du den Buchstaben sehen willst.
    Mit %d oder %x wenn dich der Zahlenwert von *pw interessiert.



  • Hallo,

    danke erstmal.

    - %s habe ich verstanden - erwartet einen Zeiger

    Wo ist denn 'T' am Anfang gespeichert, wenn in pw die Adresse gespeichert wird in der das T gespeichert ist?

    pw ist ein Zeiger und erwartet eine Adresse. Wenn man = "" zuweist, wird dann automatisch die Adresse des ersten Zeichens übergeben? Ist das richtig so?



  • pw ist ein Zeiger und erwartet eine Adresse.

    Oder einen anderen Zeiger.

    Wenn man = "" zuweist, wird dann automatisch die Adresse des ersten Zeichens übergeben?

    Ja, und die Adresse des nächsten Zeichens bekommt man, in dem man den Zeiger inkrementiert.

    Wenn du wirklich weisst, was du tust, funktioniert das ursprüngliche Beispiel auch:

    int *c= malloc(sizeof(int*));
    char **pw = malloc(sizeof(char*));
    
    *c = 1; /* geht */
    *pw = "Test"; /* geht jetzt */
    pw = "Test";  /* geht nicht mehr*/
    
    printf("pw=%s", pw);  /* geht nicht mehr */
    printf("pw=%s", *pw); /* geht jetzt */
    

    Aber da du noch nicht verstanden hast, was Zeichenketten sind, lege ich dir ans Herz, dich mal kurz darüber informieren.



  • Aber Achtung:

    char *pw;
    char s[100];
    
    pw = "Hallo"; /* geht */
     s = "Welt!"; /* geht nicht !!*/
    

    pw zeigt auf Hallo, da man pw einen Wert zuweisen kann.
    Hier wird Speicher für pw (4 Byte) und für "Hallo" (6 Byte) belegt.

    s belegt 100 Byte an einer festen Stelle, daher klappt die Zuweisung dort nicht.
    Daher nimmt man dort strcpy(s,"Welt!"); welches dann "Welt!" an die Speicherstellen von s kopiert.

    Ansonsten verhalten sich s und pw meist gleich.



  • Hallo,

    Danke.

    Zeiger auf Zeiger haben wird nur kurz angesprochen, aber wird nicht weiter geübt.

    /* Ausgabe beider Strings */
    printf("\n%s <--> %s\n", str1, str2);
    

    Dort im Quellcode des Übungsblattes ist es mir aufgefallen und deswegen habe ich gefragt.


Anmelden zum Antworten