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

Ton*_* Yu 8 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)
Run Code Online (Sandbox Code Playgroud)

结果指针是:

<class 'ctypes.LP_c_char'> 
Run Code Online (Sandbox Code Playgroud)

但是当我用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)
Run Code Online (Sandbox Code Playgroud)

产生的"ptr"字段是

<type 'str'>
Run Code Online (Sandbox Code Playgroud)

换句话说,指针已在进程中的某处解除引用.

JAB*_*JAB 10

http://docs.python.org/library/ctypes.html#ctypes.c_char_p

当它指向以零结尾的字符串时表示C char*数据类型.对于也可能指向二进制数据的通用字符指针,必须使用POINTER(c_char).

c_char_p被映射到Python的str类型,因为它假设你指的是一个字符串,当你char *在C中使用时通常就是这种情况.LP_c_char没有这样的假设.

基本数据类型,作为外部函数调用结果返回时,或者,例如,通过检索结构字段成员或数组项,将透明地转换为本机Python类型.换句话说,如果外部函数具有c_char_p的重定型,则始终会收到Python字符串,而不是c_char_p实例.