Disponible la nueva versión "donationware" 7.3 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).