En utilisant la flèche -> et le point. opérateurs réunis en C

J’avais l’impression qu’il était possible d’accéder aux données d’un sous-nœud d’une liste chaînée ou d’une structure similaire en utilisant ensemble les opérateurs flèche et point, comme suit:

typedef struct a{ int num; struct a *left; struct a *right; }tree; tree *sample; ... if(sample->left.num > sample->right.num) //do something 

mais quand j’essaie d’implémenter cela, utilisez -> et. pour accéder aux données d’un sous-noeud, l’erreur “Demande de membre num dans une structure ou une union”.

Utilisez -> pour les pointeurs; utiliser . pour les objects.

Dans votre cas particulier, vous voulez

 if (sample->left->num > sample->right->num) 

parce que tous les sample , sample->left et sample->right sont des pointeurs.

Si vous convertissez l’un de ces pointeurs dans l’object pointé; utiliser . au lieu

 struct a copyright; copyright = *(sample->right); // if (sample->left->num > copyright.num) if (*(sample->left).num > copyright.num) 

Puisque je ne le vois pas mentionné explicitement:

  • Utilisez -> pour déréférencer le pointeur sur son côté gauche et accéder au membre sur son côté droit.
  • Utilisation . accéder au membre situé à sa droite de la variable située à sa gauche.

sample-> left donne une struct a* , pas une struct a , nous avons donc affaire à des pointeurs. Donc, vous devez toujours utiliser -> .

Vous pouvez cependant utiliser sample->left->num .

. est destiné à accéder aux membres d’une structure (ou d’un syndicat), par exemple

 struct S { int x; } S test; test.x; 

-> est un moyen plus court d’écrire (* pointer_to_struct) .struct_member

sample->left et sample->right sont également des pointeurs, vous voulez donc:

 if (sample->left->num > sample->right->num) { // do something }