Anzeige:
Ergebnis 1 bis 2 von 2

Thema: pointer declaration vs. &-operator

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100

    pointer declaration vs. &-operator

    Servus!

    Wenn wir schon dabei sind: was ist eigentlich der Unterschied zwischen diesen beiden Varianten?

    a) pointer declaration / ohne &
    Code:
    void blubb(object *o)
    {
        printf("hello %s", o->irgendwas);
    }
    
    [...]
    
    object *o = object_new();
    blubb(o);
    a) pointer declaration / ohne &
    Code:
    void blubb(object o)
    {
        printf("hello %s", o->irgendwas);
        // nebenbei:
        // bin mir grad nicht sicher, ob das so funktioniert
        // oder ob man o hier gar nicht über den -> ansprechen kann
    }
    
    [...]
    
    object o;
    object_new(&o);
    blubb(&o);
    Also zunächst: welche Variante ist üblicher? Wann nimmt man welche? Ich hab' den Eindruck, dass ich bei Lib1 zu Variante a gezwungen werden, von Lib2 aber zu Variante b. Jetzt bin ich verwirrt, welche ich in meinem Code benutzen sollte.

    Naja und falls die Sache über dem Kommentar in Variante b nicht klappt, also wenn ich dort o nicht über -> ansprechen kann, dann stellt sich mir die Frage: wie mach ich das hier am geschicktesten? Klar könnte ich mir so behelfen:
    Code:
    object *o_pointer = &o;
    printf("hello %s", o_pointer->irgendwas);
    Aber das wäre ja wohl quatsch ...oder?

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Also mal grundlegend:
    Code:
    o->irgendwas
    ist syntactic sugar für
    Code:
    (*o).irgendwas
    .

    Nun zum Unterschied:

    Bei Variante a) gibt object_new einen object pointer zurück, welcher dann von void blubb wiederum als Argument genommen wird. Das heisst, bei den Funktionsaufrufen wird ein "natürlich grosser" (der Architektur entsprechend heutzutage meist 4 oder 8 byte) Wert (eine Speicheradresse) kopiert.

    Bei Variante b) ist ein Durcheinander zwischen object pointers und object values. object_new nimmt als Argument einen object pointer zu einem bereits allozierten object (auf dem Stack in deinem Fall) und macht etwas damit. Dann übergibst du void blubb zwar einen object pointer, erwartet wird aber ein object value (das heisst auch, dass das bei einem korrekten Aufruf das ganze object kopiert würde -- vgl. call-by-value / call-by-reference).

    Das printf in Variante b) sollte wohl wie folgt aussehen:
    Code:
    printf("hello %s", o.irgendwas);
    HTH
    -- jeebee

    PS: mir hat das Buch "The C Programming Language 2nd Edition" von Brian Kernighan und Dennis Ritchie sehr geholfen (auch was Pointer anbelangt), als ich vor Jahren mit C begonnen habe.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •