在ctypes中LP_ *指针和* _p指针之间有什么区别? (与结构的奇怪交互)

时间:2011-07-14 16:55:18

标签: python ctypes

我无法理解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 个答案:

答案 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实例。