Zeigerarethmetik / Zeigergröße



  • Nehmen wir an ich hab 2 Variablen mit jeweils einem Zeiger

    int a=0;
    int *pa= &a;
    
    char b='?';
    char *pb= &b;
    

    Wie groß sind die zeiger im speicher? nehmen pa und pb gleich viel platz ein? Die adressierungraum wird bei beiden ja 32Bit sein? Würde ich haber Zeiger inkrementieren würde pa ja um 4 byte (32bit) springen und pb umd 1 byte (8Bit) sprigen, beide sind aber 32Bit groß oder? so wie der void zeiger?



  • Ja, auf 32-Bit-Systemen sind beide Pointer 32 Bit lang. es muss in der Ptr-Variable ha schließlich eine 32 Bit lange Speicheradresse untergebracht werden, unabhängig davon, worauf der Zeiger letztendlich zeigen soll. Ein Pointer auf double (64 Bit) ist ja auch nur 32 Bit groß.



  • char ac[40]="Hallo Welt;
    char *pb=ac;
    

    d.h. der ist 32 bit groß, aber bei pb wird die 32Bit adresse um 8bit verschoben im speicher?



  • ^^das kann man so genau nicht sagen. zeiger sind breit genug, um den gesamten adressraum abzudecken, in dem die daten stecken können. aber das ist auf jedem prozessortyp unterschiedlich. manche haben verschiedene zeigertypen (z.b. für near- und far- adressierung).
    beim inkrementieren kommt immer soviel dazu, wie breit die objekte sind, auf die der zeiger zeigen soll. bei einem char* üblicherweise 1, bei einem int* 2 oder mehr, bei double* sinds 8, bei zeigern auf structs die grösse der struct, usw...
    🙂



  • Interessant:) Jeder Zeiger enthält auch Typinformationen und Speicherposition nehm ich an. 🙂



  • BorisDieKlinge schrieb:

    Jeder Zeiger enthält auch Typinformationen ....

    naja, der compiler kennt den zeigertyp, weil man ihn immer hinschreiben muss. daher weiss er auch, wieviel er bei ++ dazurechnen soll. bei einem void* kann er aber nicht rausfinden, was das mal war. sowas wie 'instanceof' kennt C ja nicht (ist vielleicht auch besser so).
    🙂



  • was würde passieren wenn ich

    int a=6;
    
    void *t= &a;
    
    t++;
    

    mache?

    Habe grad keinen Compiler zu hand



  • PointMePlz schrieb:

    was würde passieren wenn ich

    int a=6;
    
    void *t= &a;
    
    t++;
    

    mache?

    Habe grad keinen Compiler zu hand

    compiler würde meckern, dass man t++ auf void-Zeiger nicht ausführen kann, dazu muss er die Anzahl der Bytes kennen, um die er inkrementieren muss und das ist bei void-Zeiger nicht der Fall.

    BorisDieKlinge schrieb:

    Interessant:) Jeder Zeiger enthält auch Typinformationen und Speicherposition nehm ich an. 🙂

    nein, ein zeiger speichert nur eine Adresse, mehr nicht. Der Compiler weiß aber bei einem nicht-typenlosen Zeiger, um welches Datentyp es sich handelt und somit wie viele Bytes es in Anspruch nimmt. Siehe frickys und meine obige Antwort.



  • PointMePlz schrieb:

    char ac[40]="Hallo Welt;
    char *pb=ac;
    

    d.h. der ist 32 bit groß

    fair enough.

    PointMePlz schrieb:

    aber bei pb wird die 32Bit adresse um 8bit verschoben im speicher?

    32bit adresse um 8 bit verschoben? Wieso soll irgendeiner Zeiger soll verschoben sein? oder wie?
    😕


Anmelden zum Antworten