pointer auf vektoren



  • Hallo leute,

    verstehe folgendes programmstück nicht, hoffe ihr könnt mir auf die Sprünge helfen:

    char sx[] ="Eins", sy[]="Zwei";
    char *psx=sx, *psy=sy, *pshilfs;
    
    pshilfs=psx;
    psx=psy;
    psy=pshilfs;
    printf("\n%x %x",psx,psy);
    printf("\n%s %s",psx,psy);
    

    bis zu dem ersten printf versteh ichs ist ja nicht sonderlich schwer.

    Bisher war ich immer der meinung das ein pointer der nicht dereferenziert wird die adresse ausgibt, die die Variable hat auf die er zeigt?

    also so wie beim ersten printf.

    wieso wird mir jetzt beim zweiten printf "Zwei" "Eins" ausgegeben ohne das ich dereferenziert habe?

    mfg
    mb01



  • mb01 schrieb:

    char sx[] ="Eins", sy[]="Zwei";
    char *psx=sx, *psy=sy, *pshilfs;
    
    pshilfs=psx;
    psx=psy;
    psy=pshilfs;
    printf("\n%x %x",psx,psy);
    printf("\n%s %s",psx,psy);
    

    bis zu dem ersten printf versteh ichs ist ja nicht sonderlich schwer.

    Das ist ziemlich ungewöhnlich, weil das erste printf im Gegensatz zum zweiten falsch ist.

    %x ist nur für int und unsigned int gültig. Falls Pointer genauso repräsentiert werden, funktioniert es damit zufällig auch, aber das muss ja nicht so sein und ist es oft auch nicht. Pointer gibt man mit %p aus.

    Bisher war ich immer der meinung das ein pointer der nicht dereferenziert wird die adresse ausgibt, die die Variable hat auf die er zeigt?

    Pointer geben überhaupt nichts aus, die sind einfach nur da. printf gibt was aus. Und die Formatangabe %s heißt für printf: Es wird ein Pointer auf char erwartet, der auf ein nullterminiertes char-Array zeigt, und es werden alle Zeichen bis zu diesem Nullzeichen ausgegeben. Das ist halt so, printf macht das so. Und wenn du mal kurz nachdenkst, wirst du feststellen, dass das auch gut so ist.

    wieso wird mir jetzt beim zweiten printf "Zwei" "Eins" ausgegeben ohne das ich dereferenziert habe?

    Wenn du psx dereferenzierst, kommt 'E' raus. Das kannst du auch ausgeben, falls du das willst:

    printf("%c", *psx);
    

    Falls doch der ganze String gemeint sein sollte, ist 'E' natürlich ein bisschen wenig, da lässt du besser wie oben printf selbst das Dereferenzieren nicht nur des ersten, sondern auch aller folgenden Zeichen erledigen.


Anmelden zum Antworten