Prolog can get or modify the contents of a foreign term with the procedures
     get_contents(+Datum, ?Part, ?Value)
     put_contents(+Datum, +Part, +Value).
   It can also get a pointer to a field or element of a foreign term with the procedure
get_address(+Datum, ?Part, ?Value).
For all three of these, Datum must be a foreign term, and
Part specifies what part of Datum Value is.  If
Datum is an array, Part should be an integer index into
the array, where 0 is the first element.  For a pointer, Part
should be the atom contents and Value will be what the pointer
points to.  For a struct, Part should be a field name, and
Value will be the contents of that field.  In the case of
get_contents/3 and get_address/3, if Part is unbound,
get_contents/3 will backtrack through all the valid parts of
Datum, binding both Part and Value.  A C programmer
might think of the following pairs as corresponding to each other:
     Prolog: get_contents(Foo, Bar, Baz)
          C: Baz = Foo->Bar
     
     Prolog: put_contents(Foo, Bar, Baz)
          C: Foo->Bar = Baz
     
     Prolog: get_address(Foo, Bar, Baz)
          C: Baz = &Foo->Bar.
   The hitch is that only atomic and pointer types can be got and put
by get_contents/3 and put_contents/3.  This is because Prolog can
only hold pointers to C structures, not the structures themselves. 
This isn't quite as bad as it might seem, though, since usually
structures contain pointers to other structures, anyway.  When a
structure directly contains another structure, Prolog can get a
pointer to it with get_address/3.