ctypes中LP_*指针与*_p指针的区别是什么?(与结构体的奇怪交互)
我在理解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'>
换句话说,指针在某个过程中被解引用了。
1 个回答
10
http://docs.python.org/library/ctypes.html#ctypes.c_char_p
这个东西代表了C语言中的char *数据类型,当它指向一个以零结尾的字符串时。要处理可能指向二进制数据的一般字符指针,得用POINTER(c_char)。
c_char_p
被映射到Python的str
类型,因为通常你用C语言的char *
时,是在说字符串。LP_c_char
就没有这样的假设。
基本数据类型在作为外部函数调用的结果返回时,或者在获取结构体字段成员或数组项时,会自动转换成Python的原生类型。换句话说,如果一个外部函数的返回类型是c_char_p,你总是会收到一个Python字符串,而不是c_char_p的实例。