[C con Clase] Prioridad operadores. Punteros a struct
Marving
jr.marving en gmail.com
Lun Abr 21 18:12:35 CEST 2014
Hola.
Trasteando con los operadores y punteros a struct. Tengo un par de dudas, relacionadas con los resultados obtenidos, y me gustaría que me ayudaseis
a conocer la lógica de los operadores . . .
struct Cliente
{
char* nombre;
int edad;
char answer;
}clnt;
struct Cliente* ptr_strct = &clnt;
ptr_strct->nombre = "Bjarne Stroustrup";
ptr_strct->edad = 63;
ptr_strct->answer = 'Y';
cout << sizeof(ptr_strct) << endl;
cout << sizeof(ptr_strct->nombre) << endl;
cout << sizeof(ptr_strct->edad) << endl;
cout << sizeof(ptr_strct->answer) << endl;
cout << "Dirección de memoria " << ptr_strct << endl;
cout << "Contenido " << ptr_strct->nombre << endl;
//*****************************************************
cout <<"*ptr_strct++->nombre " << *ptr_strct++->nombre << endl;
//*****************************************************
cout << "Dirección de memoria " << ptr_strct << endl;
cout << "Contenido " << ptr_strct->nombre << endl;
cout << "------------------------" << endl;
//----------------------------------------------------------
ptr_strct = &clnt;
cout << "Dirección de memoria " << ptr_strct << endl;
cout << "Contenido " << ptr_strct->nombre << endl;
//***********************************************
cout << ++*ptr_strct->nombre << endl;
//***********************************************
cout << "Dirección de memoria " << ptr_strct << endl;
cout << ptr_strct->nombre << endl;
//----------------------------------------------------------
Output:
4
4
4
1
Dirección de memoria 0xbfabf634
Contenido Bjarne Stroustrup
*ptr_strct++->nombre B
Dirección de memoria 0xbfabf640
Contenido UWVS�i
------------------------
Dirección de memoria 0xbfabf634
Contenido Bjarne Stroustrup
RUN FINISHED; Segmentation fault; core dumped; real time: 400ms; user: 0ms; system: 0ms
------------------------------------------------------------------------------------------------
En la siguiente línea, según lo que tengo entendido
cout <<"*ptr_strct++->nombre " << *ptr_strct++->nombre << endl;
Tenemos el operando ptr_strct
sobre el operan los operadores
* y ++->
Operador unario postincremento ++ tiene la misma prioridad que -> seleccion miembros apuntador
* desreferencia tiene menor prioridad
Conflicto entre ++->. Tienen asociatividad izquierda derecha. Entonces
1º ptr_strct++->nombre // aumento el puntero char* nombre
2 *((ptr_strct++)->nombre) // lee el contenido de ese puntero j
Sin embargo lo que parece que hace es
1º ptr_strct->nombre
2º *(ptr_strct->nombre) // B
3º ptr_strct++ // Aumenta ptr_strct su sizeof
---------------------------------------------------------------------
En la siguiente línea según lo que tengo entendido
cout << ++*ptr_strct->nombre << endl;
Tenemos el operando ptr_strct
sobre el operan
++* y ->
-> tiene mayor prioridad que preincremento ++ y desreferencia *
1º ptr_strct->nombre
Conflicto entre ++**. Tiene asociatividad derecha izquierda
2º *(ptr_strct)->nombre; // 'B'
3º ++(*(ptr_strct)->nombre); // ++'B'
Podría haber aparecido algun mensaje del tipo lvalue required ++
Sin embargo aparece el mensaje
RUN FINISHED; Segmentation fault; core dumped; real time: 400ms; user: 0ms; system: 0ms
---------------------------------------------------------------------
Saludos
Más información sobre la lista de distribución Cconclase