Passing Zeiger / Verweise auf Strukturen in Funktionen

Das wird sich nach einer dummen Frage anhören, aber ich lerne immer noch C, also bitte trage es mit mir. :)

Ich arbeite an Kapitel 6 von K & R (structs) und habe bisher im Buch große Erfolge gesehen. Ich habe mich dazu entschlossen, ziemlich intensiv mit Strukturen zu arbeiten, und habe daher zu Beginn des Kapitels viel mit den Beispielen point und rect gearbeitet. Eines der Dinge, die ich ausprobieren wollte, war das Ändern descanonrect -Funktion (2. Ausgabe, S. 131) arbeitet über Zeiger und gibt daher @ zurüvoid.

Ich habe diese Arbeit, aber lief in einen Schluckauf Ich hatte gehofft, dass Sie Jungs mir helfen könnten. Ich wolltecanonRect Um ein temporäres Rechteckobjekt zu erstellen, führen Sie die Änderungen durch und weisen Sie dann den übergebenen Zeiger dem temporären Rechteck zu, wodurch der Code vereinfacht wird.

How, wenn ich das tue, ändert sich der Rect nicht. Stattdessen fülle ich die Felder des übergebenen Rect manuell neu aus. Das funktioniert.

Der Code folgt:

#include <stdio.h>

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

struct point {
    int x;
    int y;
};

struct rect {
    struct point lowerLeft;
    struct point upperRight;
};

// canonicalize coordinates of rectangle
void canonRect(struct rect *r);

int main(void) {
    struct point p1, p2;
    struct rect r;

    p1.x = 10;
    p1.y = 10;
    p2.x = 20;
    p2.y = 40;
    r.lowerLeft = p2; // note that I'm inverting my points intentionally
    r.upperRight = p1;

    printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n", 
        r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);

    // can't pass a pointer, only a reference. 
    // (Passing pointers results in illegal indirection compile time errors)
    canonRect(&r); 
    printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n", 
        r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);    
}

void canonRect(struct rect *r) {
    struct rect temp;
    temp.lowerLeft.x = min(r->lowerLeft.x, r->upperRight.x);
    temp.lowerLeft.y = min(r->lowerLeft.y, r->upperRight.y);
    temp.upperRight.x = max(r->lowerLeft.x, r->upperRight.x);
    temp.upperRight.y = max(r->lowerLeft.y, r->upperRight.y);

    r = &temp; // doesn't work; my passed-in rect remains the same

    // I wind up doing the following instead, to reassign all 
    // the members of my passed-in rect
    //r->lowerLeft = temp.lowerLeft;
    //r->upperRight = temp.upperRight;
}

Also hier sind die Fragen:

Warum tutr = &temp; nicht arbeiten? (ICHÜberlege Das liegt daran, dass ich eine Referenz anstelle eines Zeigers übergebe. Stimmt es, dass Referenzen nicht veränderbar sind, aber Zeiger?)Warum erhalte ich beim Kompilieren möglicherweise einen ungültigen Indirektionsfehler, wenn ich versuche, einen Zeiger an @ zu übergebecanonRect? (IE, wenn ich @ hätcanonRect(*r); immain().)

Ich vermute, ich kenne bereits die Antwort auf # 1, aber # 2 verblüfft mich - ich dachte, es sei legal, Zeiger weiterzugeben.

Wie auch immer ... bitte verzeihen Sie dem C-Neuling.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage