2011-04-30 13 views
12

que estaba bajo la impresión de que era posible acceder a los datos de un sub-nodo de una lista enlazada o estructura similar mediante el uso de los operadores de flecha y de puntos juntos de esta manera:Usando la flecha -> y punto. operadores juntos en C

typedef struct a{ 
int num; 
struct a *left; 
struct a *right; 
}tree; 

tree *sample; 
... 
if(sample->left.num > sample->right.num) 
    //do something 

pero cuando Intento implementar esto, usando -> y. para acceder a los datos de un subnodo obtengo el error "solicitud de miembro num en algo que no es una estructura o unión".

Respuesta

22

Use -> para punteros; usa . para objetos.

En su caso específico que desea

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

porque todos sample, sample->left y sample->right son punteros.

Si convierte cualquiera de esos punteros en el objeto apuntado; . utilizan en lugar

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

Aw. ¡Me hiciste el ninja! – luiscubal

+0

@ luiscubal todo está bien, también vi tu comentario antes de borrarlo. Gracias por la ayuda. –

3

muestra-> izquierda da una struct a*, no un struct a, por lo que estamos tratando con punteros. Entonces todavía tiene que usar ->.

Puede, sin embargo, utilizar sample->left->num.

2

. es para acceder a los miembros de una estructura (o unión), p.

struct S { 
int x; 
} 

S test; 
test.x; 

-> es un camino más corto para escribir (* pointer_to_struct) .struct_member

0

sample->left y sample->right también son punteros, por lo que desea:

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

Como yo no lo veo mencionado explícitamente:

  • Usar -> en desreferenciar el puntero en su lado izquierdo y acceda al miembro en su lado derecho.
  • Uso. para acceder al miembro en su lado derecho de la variable en su lado izquierdo.
+1

Busqué en Google "c arrow vs dot operator" y busqué aquí. Suponiendo que esto sea preciso, es la descripción más clara y sucinta que encontré. Si alguien con más conocimiento de C pudiera confirmarlo o negarlo, sería genial. Gracias. –

Cuestiones relacionadas