The member operator . is used to access members of structures
that are themselves members of a larger structure. No parentheses are
needed to force a special order of evaluation; a member operator
expression is simply evaluated from left to right.
In principle, structures can be nested indefinitely. Statements such as
the following are syntactically acceptable, but bad style. (See Style.)
my_structure.member1.member2.member3.member4 = 5;
What happens if a structure contains an instance of its own type,
however? For example:
struct regression
{
int int_member;
struct regression self_member;
};
In order to compile a statement of this type, your computer would
theoretically need an infinite amount of memory. In practice, however,
you will simply receive an error message along the following lines:
struct5.c: In function `main':
struct5.c:8: field `self_member' has incomplete type
The compiler is telling you that self_member has been declared
before its data type, regression has been fully declared -- naturally,
since you're declaring self_member in the middle of declaring its own data type!