Passando ponteiros / referências para estruturas em funções

Isso vai parecer uma pergunta boba, mas eu ainda estou aprendendo C, então por favor, tenha paciência comigo. :)

Estou trabalhando no capítulo 6 de K&R (structs) e, até o momento, obtive grande sucesso. Decidi trabalhar com estruturas bastante e, portanto, trabalhei bastante no início do capítulo com os exemplos pontuais e retos. Uma das coisas que eu queria tentar foi mudar ocanonrect A função (2ª edição, pág. 131) funciona via ponteiros e, portanto, retornavoid.

Eu tenho esse trabalho, mas tive um soluço com o qual eu esperava que vocês pudessem me ajudar. Eu queriacanonRect para criar um objeto de retângulo temporário, faça suas alterações e reatribua o ponteiro que é passado para o retângulo temporário, simplificando o código.

No entanto, se eu fizer isso, o ret não muda. Em vez disso, vejo-me repovoando manualmente os campos do retângulo em que sou informado, o que funciona.

O código a seguir:

#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;
}

Então, aqui estão as perguntas:

Porquer = &temp; não funciona? (EUpensar isso é porque passo em uma referência em vez de um ponteiro; Estou correto ao pensar que as referências não são modificáveis, mas os ponteiros são?)Por que posso obter um erro de tempo de compilação de indireção ilegal se eu tentar passar um ponteiro paracanonRect? (Ou seja, se eu tivessecanonRect(*r); nomain().)

Eu suspeito que já sei a resposta para o número 1, mas o número 2 me deixa perplexo - eu pensei que era legal passar sugestões.

Enfim ... por favor, perdoe o C newb.

questionAnswers(6)

yourAnswerToTheQuestion