Passer des pointeurs / références à des structures dans des fonctions

Cela va sembler une question stupide, mais je suis encore à apprendre le C, donc s'il vous plaît garder avec moi. 🙂

Je suis en train de travailler sur le chapitre 6 de K&R (struct), et à ce jour à travers le livre, ont connu un grand succès. J'ai décidé de travailler avec des structures assez fortement, et n'a donc beaucoup de travail au début du chapitre, le point et rect exemples. L'une des choses que je voulais faire était de changer la canonrect fonction (2e Édition, p 131) de travail via des pointeurs, et donc de retour void.

J'ai ce travail, mais a couru dans un hoquet, j'ai été en espérant que vous les gars pourrait m'aider avec. Je voulais canonRect pour créer un temporaire de l'objet rectangle, effectuer ses modifications, puis réaffecter le pointeur passé à la temporaire rectangle, ce qui permettra de simplifier le code.

Cependant, si je fais ça, le rect ne change pas. Au lieu de cela, je me retrouve manuellement repeupler les domaines de la rect je suis passé de, qui ne de travailler.

Le code suivant:

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

Donc voici les questions:

  1. Pourquoi ne r = &temp; pas de travail? (Je pense c'est parce que je passe dans une référence au lieu d'un pointeur; ai-je raison de penser que les références ne sont pas modifiés, mais les pointeurs sont?)
  2. Pourquoi pourrais-je obtenir un acte illégal d'indirection erreur de compilation si j'essaie de passer un pointeur vers canonRect? (C'est à dire, si j'avais canonRect(*r); dans main().)

Je pense que je connais déjà la réponse à #1, #2 confond moi -- j'ai pensé qu'il était légal de passer des pointeurs autour de.

De toute façon ... veuillez pardonner le C newb.

source d'informationauteur John Rudy