Structure Member Access

From RAD Studio
Jump to: navigation, search

Go Up to Structures Index

Structure and union members are accessed using the following two selection operators:

  • . (period)
  • -> (right arrow)

Suppose that the object s is of struct type S, and sptr is a pointer to S. Then if m is a member identifier of type M declared in S, the expressions s.m and sptr->m are of type M, and both represent the member object m in S. The expression sptr->m is a convenient synonym for (*sptr).m.

The operator . is called the direct member selector and the operator -> is called the indirect (or pointer) member selector. For example:

struct mystruct
{
   int i;
   char str[21];
   double d;
} s, *sptr = &s;
    .
    .
    .
s.i = 3;            // assign to the i member of mystruct s
sptr -> d = 1.23;   // assign to the d member of mystruct s

The expression s.m is an lvalue, provided that s is an lvalue and m is not an array type. The expression sptr->m is an lvalue unless m is an array type.

If structure B contains a field whose type is structure A, the members of A can be accessed by two applications of the member selectors

struct A {
   int j;
   double x;
};
struct B {
   int i;
   struct A a;
   double d;
} s, *sptr;
    .
    .
    .
s.i = 3;            // assign to the i member of B
s.a.j = 2;          // assign to the j member of A
sptr->d = 1.23;     // assign to the d member of B
sptr->a.x = 3.14  // assign to x member of A

Each structure declaration introduces a unique structure type, so that in

struct A {
   int i,j;
   double d;
} a, a1;
struct B {
   int i,j;
   double d;
} b;

the objects a and a1 are both of type struct A, but the objects a and b are of different structure types. Structures can be assigned only if the source and destination have the same type:

a = a1;   // OK: same type, so member by member assignment
a = b;    // ILLEGAL: different types
a.i = b.i; a.j = b.j; a.d = b.d /* but you can assign member-by-member */