Pointer problem



  • Vielen Dank für deine Hilfe. In meinem Code ist die Zeile genau so wie ich sie oben geschrieben habe, bei mir kompilliert alles sauber durch. Aber egal, so rein zum verständnis, was bringt der Typecast auf einen typ vom typ pointer auf pointer (wow, guter Satz... 🙂 ) wenn man ihn nacher wieder dereferenziert, würde es da nicht genügen ihn einfach in den gleichen typ umzuwandeln, also hier (byte 😉 part?

    Was meinst du mit:

    Und (byte😉 part würde dann auf die Speicheraddresse 5 zeigen.

    Meiner meinung nach würde (byte😉 part auf 0x001 zeigen, da ja nur einfach dereferenziert wird?

    Gruess
    Sebi



  • Nein, es gibt zwischen den Zeilen fundamentale Unterschiede.

    Die erste Zeile interpretiert den Inhalt von part als eine Adresse, an der die Adresse eines (Array von) Bytes steht. Durch die Dereferenzierung wird auf die Adresse eines (Array von) Bytes zugegriffen und diese geändert. Anschließend enthält part also immernoch dieselbe Adresse, an der aber nun die Adresse eines anderen (Array von) Bytes steht als zuvor. Der Inhalt von part hat sich nicht geändert, wohl aber das, worauf part zeigt (inhaltlich).

    Die zweite Zeile interpretiert den Inhalt von part als Adresse, an der ein (Array von) Byte steht, also etwas grundsätzlich anderes. Durch die Zuweisung von link an part wird also part selbst geändert.



  • Sebi3000 schrieb:

    *(byte **) part = link;
    

    Was macht das genau, und was ist der Unterschied zu folgendem? Ist doch eigentlich das Gleiche oder etwa nicht?

    (byte *) part = link;
    

    nee, ist nicht das gleiche.
    *(byte **) part = link;
    kopiert den inhalt von 'link' dort hin, worauf 'part' zeigt. 'part' selber wird nicht verändert.
    (byte *) part = link;
    überschreibt den inhalt von 'part' mit dem inhalt von 'link'. 'part' wird also verändert.
    🙂



  • Du kannst es ja auch mal an diesem Codebeispiel durchspielen.

    int a = 5;
    int *ptr_a;
    int **handle_a;
    int *deref_a;
    
    ptr_a = &a;
    handle_a = (int**) ptr_a;
    deref_a = *handle_a;
    


  • Hallo,

    da wir uns im ANSI-C-Forum befinden, sollte man darauf hinweisen, dass

    (byte *) part = link;
    

    im Standard nicht erlaubt ist (das Resultat eines cast ist ein r-value), obwohl es Compiler gibt, die es im Rahmen einer Erweiterung doch zulassen (gcc gibt dabei eine Warnung aus).

    MfG,

    Probe-Nutzer



  • Vielen Dank euch allen

    Ich denke ich habe es trotz OpenAir am Wochenende endlich geschnallt, oder meine es zumindest....

    Noch zum Codebeispiel vom Bitburger, in deref_a steht dann eine fünf oder, also eine dereferenzierung würde mir irgendwas undefiniertes ausgeben, und zwar das was an speicherstelle 0x5 steht oder?

    Gruess
    Sebi



  • Sebi3000 schrieb:

    Noch zum Codebeispiel vom Bitburger, in deref_a steht dann eine fünf oder, also eine dereferenzierung würde mir irgendwas undefiniertes ausgeben, und zwar das was an speicherstelle 0x5 steht oder?

    ja, aber undefiniert ist es nicht. kommt auf dein system an, ob es zugriffe auf die adresse 5 zulässt oder nicht.
    btw, wieso bitburger aus 'nem int* einen int** macht, ist mir aber schleierhaft.
    🙂



  • also, ich finde immer wieder schön und erschreckend was man alles mit Pointern machen kann. Allerdings muss ich zugeben, dass die Deferenzierung über mehrere Pointern selbst mir Schwierigkeiten bereitet.

    Ich sehe oft von Anfängern bzw. nicht ganz erfahrenen C-Programmierern, dass sie dazu tendieren, solche Probleme (wie oben) zu lösen und/oder sowas zu schreiben, was bitburger geschrieben hat. Da frage ich mich: wieso so kompliziert, wenn es einfacher geht?



  • An fricky:

    Ist mein Beispiel so schrecklich ? Wenn ja, mach dir keine Sorgen. Ich habe das Beispiel so konstrukiert dass es zu meiner Aussage passt und einem das Verständniss von Pointer näher bringen soll. Der Quelltext wurde also völlig sinnfrei erzeugt.



  • Bitte ein Bit schrieb:

    Ist mein Beispiel so schrecklich ?

    ich frag mich nur, wozu der *int *handle_a da ist?
    🙂



  • Naja, ich glaube so richtig verstanden hast du mich nicht. Der ganze Quelltext hat keinen Sinn außer mit der Pointerarithmetik ein wenig rumzuspielen.

    Der Quelltext habe ich nur geschrieben und getestet weil ich mal sehen wollte, was denn nun passiert, wenn ich wild mit Pointer herumschlage.



  • Bitte ein Bit schrieb:

    Naja, ich glaube so richtig verstanden hast du mich nicht. Der ganze Quelltext hat keinen Sinn außer mit der Pointerarithmetik ein wenig rumzuspielen.

    wo ist denn da pointerarithmetik? so'n komischer cast von int* nach int** kann man ja wohl kaum 'arithmetik' schimpfen.
    🙂


Anmelden zum Antworten