It would be great if the documentation of c_char_p (http://docs.python.org/library/ctypes.html#ctypes.c_char_p) could be reformulated as follows (would have saved me quite some time): class ctypes.c_char_p¶ Represents the C char * datatype when it points a zero-terminated string. For a general character pointer that may also point to binary data, POINTER(c_char) must be used. The constructor accepts an integer address, or a string.
I don't want to judge if the best way to represent binary data in C is a void* or char*, but there is a lot of C code out there that uses char*, and if we want to interface with such a library we need to use POINTER(c_char). Note that my docpatch doesn't say anything about using void_p or not: "For a general *character* pointer that may point to binary data, POINTER(c_char) must be used". This refers only to char*, so if the C code uses void* instead, we can of course also use c_void_p on the Python side.