When a C++ function requires or returns a parameter of type char *, the translation depends on the intended meaning of char *. If a null-terminated string was intended, then the Scheme translation requires or returns a string; any string allocation, deallocation, or lifetime concerns of the C++ function should be ignored. If a pointer to a single character was intended, then the type is treated as int *.
When a C++ function requires or returns a reference to a value, then the Scheme translation is the same as if the C++ function required or returned a pointer to the value.
When a C++ function requires or returns a pointer to a C++ object, the Scheme translation requires or returns a Scheme object from the corresponding class.
When a C++ function requires a non-array pointer as an argument, then the Scheme translation requires a boxed value of the appropriate type. This lets the C++ function modify the referenced value. The C++ function cannot retain the requested pointer or attempt to modify the value after returning control to the caller.
If the C++ function allows a NULL pointer (whether for a string, object pointer, or referenced value), then the Scheme translation allows the empty list.
When a C++ function requires an array pointer and counter integer as arguments, the Scheme translation requires a single parameter: list containing values of the appropriate type (the counter argument is omitted). The contents of the array cannot be modified. Similarly, if a C++ function returns an array and takes a pointer to a counter buffer, the Scheme translation returns a list and the counter buffer parameter is omitted.
When a C++ function requires a function pointer argument, the Scheme translation requires a closure. The closure is required to take arguments according to the translation rules of this section (with respect to the function pointer's prototype). When the C++ function requires an additional void * parameter that is passed back to the given function on invocation, then the Scheme translation omits the void * parameter and omits the argument on invocation of the closure.