En mi código de muestra a continuación:

#include <stdlib.h>
#include<stdio.h>    
int main()
{

  typedef struct {float x; float y;}C;

  C z;

  z.x=4;
  z.y=6;

  C *zpt=&z;

  *zpt.x;

  printf("%f",(*zpt).x);
}

Sé que (*zpt).x o zpt->x se usa para eliminar la referencia del puntero. Pero obtengo un error cuando uso *zpt.x, Error - "solicitud de miembro 'x' en algo que no es una estructura o unión". ¿Alguien puede explicar qué hace *zpt.x? ¿Es esta una sintaxis válida y, en caso afirmativo, dónde y cómo debe usarse?

1
Arnold 31 ene. 2015 a las 00:32

2 respuestas

La mejor respuesta

El error que obtienes es este:

error: request for member ‘x’ in something not a structure or union

Como le informa el compilador, zpt no es ni una estructura ni una unión. El problema es que la precedencia del operador de punto (.) es mayor que la del asterisco (*), por lo que el punto se habilita primero y como resultado se obtiene el error, ya que el compilador lee esto como: *(zpt.x).

De Precedencia del operador C

Prioridad 1:. Estructura y acceso de miembros sindicales

Prioridad 2: * Indirección (desreferencia)

Poner paréntesis deja en claro cómo desea que funcionen los operadores, por lo que

(*zpt).x

Funcionará bien, pero recibirá una advertencia como esta:

warning: statement with no effect [-Wunused-value]

Porque no haces nada, pero sé que esto es solo un código de prueba.


Sugeriría leer la pregunta relevante:

¿Por qué existe el operador de flecha (->) en C?

4
Community 20 jun. 2020 a las 09:12

Esto sale mal *zpt.x;

Porque se interpreta como

*(zpt.x)

Que no tiene sentido. Primero no hay zpt.x, segundo incluso si eso fuera un flotador de alguna manera no se puede usar * en un flotador

Por eso existe el operador ->: zpt->x es lo mismo que (*zpt).x pero más fácil de leer y escribir

4
pm100 30 ene. 2015 a las 21:38