This version typedefs Point and Vector to be pointers to structs. That is, Points and Vectors act like references, just as in Java. The big downside of this is that the methods that create new Points/Vectors must malloc space for them, and that means that the caller must then remember to free that space (by calling the corresponding delete method). For the same reason, an upside is that the client of this code can't just stack allocate a Point or Vector -- they must call Point_new or Vector_new. That makes it harder for the client to forget to call Point_new, which would result in an uninitialized Point object on the stack.