Pointer inkrementieren



  • Hallo,

    ich habe eine Frage zur inkrementierung eines pointers in C.
    In meinem Buch steht grob gesagt geschrieben, dass man den Pointer um eins erhöhen kann, indem man einfach den Pointer mit eins addiert.
    Aber mir scheint, als würde sich diese Aussage nur auf Pointer beziehen, welche auf ein Array-Element zeigen.

    ist das der Fall.?
    Also kann man nur dann den pointer erhöhen, verringern usw., wenn dieser auf einen Array zeigt?

    Vielen Dank



  • Du kannst theoretisch jeden Pointer inkrementieren, es macht nur keinen Sinn wenn du dabei in Bereiche gerätst, die dir nicht gehören. Der folgende Code wird zwar vom Compiler akzeptiert, bewirkt aber undefiniertes Verhalten:

    int i;
    int* p = &i;
    ++p;
    *p = 4711; //welchen Speicherbereich beeinflusst diese Anweisung?
    

  • Mod

    Es ist der Pointeraddition egal, worauf der Pointer zeigt. Es macht jedoch in der Regeln nur dann Sinn so etwas zu tun, wenn an der Stelle auf die er hinterher zeigt, auch ein weiteres Element vom passenden Typ steht. Das ist bei Arrays der Fall, ansonsten eigentlich nur bei fiesen Hacks.



  • Ihr seid super! Das hat mir sehr geholden.

    Dazu habe ich gleich noch eine Frage zu Pointer:

    Es kann ja sein, dass die verschiedenen Datentypen auf verschiedenen Rechnern unterschiedliche Kapazitäten beeinflussen. Bei mir haben int z.B. 4 bytes.

    Wenn ich nun den Pointer benutze, um ein Array "durchzugehen", könnte dies dann zu komplikationen führen, wenn ich das Programm auf einem anderen Rechner laufen lasse?
    Oder zeigt dann auch der Pointer bei ihn z.B. auf den nächsten Eintrag des arrays?

    Grüsse



  • Der Compiler weiß, wie groß der Datentyp ist, auf den der Pointer zeigt - und bei der Addition wird der Zeiger um diese Größe weitergeschoben, das heißt er landet auf jeden Fall auf dem nächsten Array-Element, auch wenn der Typ sich ändert oder die Größe sich auf anderen Rechnern unterscheidet.



  • Ein Pointer zeigt auf einen Speicherbereich, in dem etwas dem Programm bekanntes drin steht. Das kann auch ein Array von Character-Zeichen sein. Und genau für einen solchen Array macht es Sinn, mit Inkrementieren zu arbeiten. Das können wir im einzelnen schwer hinreichend erklären. Das musst du besser selbst machen und nachvollziehen!



  • Schreiber2 schrieb:

    wenn ich das Programm auf einem anderen Rechner laufen lasse

    Für Systeme, bei denen zB. ein int eine andere Größe hat, muss das Programm eh neu kompiliert werden. Da kann der Compiler sich dann auch jedes mal neu entscheiden, was genau bei "++p" passiert 😉



  • Schreiber2 schrieb:

    Wenn ich nun den Pointer benutze, um ein Array "durchzugehen", könnte dies dann zu komplikationen führen, wenn ich das Programm auf einem anderen Rechner laufen lasse?

    Nein.

    Schreiber2 schrieb:

    Oder zeigt dann auch der Pointer bei ihn z.B. auf den nächsten Eintrag des arrays?
    Grüsse

    Ja.
    Das ist auch nicht Problem des Compilers, sondern Sache des ausführbaren Programms.
    Dort hat der Compiler seine (zum Compilerlaufzeitpunkt) aktuellen Speichergrößen/Elementgrößen/usw. hinlegt, die die dann aktuelle Laufzeitumgebung einfach abarbeitet.
    Probleme hast du nur insofern, falls du auf Daten mit Code zugreifst, der mit Compilern unterschiedlicher Bitbreite (z.B. 32/64) erzeugt wurde (z.B. bei Dateien oder prozessübergreifenden Datenbereichen) oder im Netzwerk Daten zwischen unterschiedlichen Rechnerarchitekturen (Endian/Bytefolgen) austauschst.
    Dafür gibt es dann entsprechende Bibliotheken.



  • Beispiel:

    int foo[12];
    int* ptr = &foo[3];
    ptr++; //ptr zeigt auf foo[4]
    ptr += 4; //ptr zeigt auf foo[8] (nicht auf foo[5] was man bei sizeof(int) == 4 noch meinen könnte)
    

Anmelden zum Antworten