When VALUE is a pointer, it is a pointer to one of the
defined Ruby object structures---you can't have a VALUE that points to an
arbitrary structure. The structures for each built-in
class are defined in ``ruby.h''
and are named RClassname, as in RString and
RArray.

You can check to see what type of structure is used for a particular
VALUE in a number of ways. The macro TYPE(obj)
will return a constant representing the C
type of the given object: T_OBJECT, T_STRING, and so on.
Constants for the built-in classes are defined in ``ruby.h''.
Note that the type we are referring to here is an
implementation detail---it is not the same as the class of an object.

If you want to ensure that a value pointer points to a particular
structure, you can use the macro Check_Type, which will raise a
TypeError exception if value is not of the expected
type (which is one of the constants T_STRING,
T_FLOAT, and so on):

Check_Type(VALUE value, int type)

If speed is an issue, there are faster macros that check specifically
for the immediate values Fixnum and nil.

Again, note that we are talking about ``type'' as the C structure that
represents a particular built-in type. The class of an object is a
different beast entirely. The class objects for the built-in classes
are stored in C global variables named rb_cClassname
(for instance, rb_cObject); modules are named
rb_mModulename.

It wouldn't be advisable to mess with the data in these
structures directly, however---you may look, but don't touch unless
you are fond of debuggers. You should normally use only the supplied
C functions to manipulate Ruby data (we'll talk more about this in just
a moment).

However, in the interests of efficiency you may need to dig into these
structures to obtain data. In order to dereference members of these C
structures, you have to cast the generic VALUE to the proper
structure type. ruby.h contains a number of macros that perform
the proper casting for you, allowing you to dereference structure
members easily. These macros are named
RCLASSNAME, as in RSTRING or RARRAY. For
example: