¡Nuevo!  por fin disponible la versión 5 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.5.4  Acceso a miembros de estructuras

§1  Sinopsis

La gramática C++ dispone de dos operadores para referenciar a los miembros de estructuras y uniones. So conocidos como operadores de selección de miembro:

§1.1  .    Selector directo   ( 4.9.16)

Una expresión del tipo sT.obj representa el miembro obj de sT, que suponemos es la instancia de una estructura. La expresión es un Lvalue siempre que sT no lo sea, y obj no sea una matriz.

§1.2  ->   Selector indirecto ( 4.9.16)

Una expresión del tipo stPt -> obj representa el miembro obj de sT siempre que stPt sea un puntero a dicha instancia. La expresión es un Lvalue siempre que obj no sea una matriz. Esta expresión es equivalente, y preferible, a (*stPt).obj.

El uso de uno u otro es indiferente, depende de que se tenga un identificador de la estructura, en cuyo caso puede usarse el selector directo (expresión sT.obj ), o un puntero, en cuyo caso puede usarse el indirecto (expresión: stPt->obj )

§2  Ejemplo

struct Str {        // declara estructura Str
   int i;
   char a;
} s, *sptr = &s;    // declara s tipo Str, y sptr puntero a s
...
s.i = 3;            // asigna 3 al miembro i de s
sptr -> a = 'B';    // asigna 'B' al miembro a.s

§3  Acceso a miembros de estructuras anidadas

Si existen estructuras anidadas, es decir, si la estructura B contiene un campo a de tipo estructura A, los sub-miembros de a pueden ser accedidos mediante una doble aplicación del operador de selección. Por ejemplo:

struct A {
   int j;  double x;
};

struct B {
   int i;  double d;
   struct A a;
} s, *sptr = &s;
...
s.i = 3;             // asigna 3 al miembro i de B
s.a.j = 2;           // asigna 2 al miembro j de A
sptr->d = 1.2;       // asigna 1.2 al miembro d de B
sptr->a.x = 3.1;     // asigna 3.1 al miembro x de A

§4  Ejemplo

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
 
struct punto {int x; int y;};  // definición de estructura
double isqrt(int valor);       // prototipo de función isqrt
 
int main(void) {         // ==============
   punto p1 = {2,3}, p2 = {4,5}, *ptr1 = &p1;
   printf ("%3d,%3d\n", p1.x, p1.y);
   printf ("%3d,%3d\n", ptr1->x, ptr1->y);

   double dist;
   dist = isqrt(p1.x * p1.x + p1.y * p1.y );
   printf("Distancia: %5.5f\n", dist);

}

double isqrt(int num) {  // definición de función isqrt
   return pow((double)num, (double).5);
}

Salida:

  2, 3
  2, 3
Distancia: 3.60555

Nota: el ANSI C dispone en la Librería Estándar de la función sqrt() que calcula directamente la raíz cuadrada, pero esta función no es estándar en ANSI C++, por lo que usamos pow() que si lo és (acepta dos duble); para ello definimos una nueva función isqrt() que calcula directamente la raíz cuadrada de un int utilizando pow(x, .5).