我无法理解Python ctypes中LP_ *(例如LP_c_char)和* _p(例如c_char_p)指针之间的区别。是否有区分它们的文件?
我读到的关于* _p指针的一点点表明它们更好(以某种未指定的方式),但当我尝试将它们用作结构域时,我会得到奇怪的行为。例如,我可以创建一个带有LP_c_char指针字段的结构:
import ctypes
char = ctypes.c_char('a')
class LP_Struct(ctypes.Structure):
_fields_ = [('ptr', ctypes.POINTER(ctypes.c_char))]
struct = LP_Struct(ctypes.pointer(char))
print type(struct.ptr)
结果指针是:
<class 'ctypes.LP_c_char'>
但是当我使用c_char_p指针字段创建结构时:
class Struct_p(ctypes.Structure):
_fields_ = [('ptr', ctypes.c_char_p)]
p = ctypes.pointer(char)
struct = Struct_p(ctypes.cast(p, ctypes.c_char_p))
print type(struct.ptr)
生成的“ptr”字段是
<type 'str'>
换句话说,指针已在过程中的某处解除引用。
答案 0 :(得分:10)
http://docs.python.org/library/ctypes.html#ctypes.c_char_p
表示指向以零结尾的字符串的C char *数据类型。对于也可能指向二进制数据的通用字符指针,必须使用POINTER(c_char)。
c_char_p
映射到Python的str
类型,因为它假设您指的是一个字符串,当您在C中使用char *
时通常就是这种情况。{{1没有做出这样的假设。
基本数据类型,作为外部函数调用结果返回时,或者,例如,通过检索结构字段成员或数组项,将透明地转换为本机Python类型。换句话说,如果外部函数具有c_char_p的重新类型,则始终会收到Python字符串,而不是c_char_p实例。