Python 什么';ctypes中LP_*指针和*p指针的区别是什么?(与结构的奇怪交互)

Python 什么';ctypes中LP_*指针和*p指针的区别是什么?(与结构的奇怪交互),python,ctypes,Python,Ctypes,我很难理解PythoncTypes中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_ =

我很难理解PythoncTypes中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'> 
生成的“ptr”字段为


换句话说,指针已在进程中的某个位置取消引用。

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

c\u char\u p
被映射到Python的
str
类型,因为它假设您引用的是字符串,这通常是在c中使用
char*
时的情况。
LP\u c\u char
不做这样的假设

基本数据类型,当作为外部函数调用结果返回时,或例如通过检索结构字段成员或数组项返回时,将透明地转换为本机Python类型。换句话说,如果一个外部函数的restype为c_char_p,那么您将始终收到一个Python字符串,而不是一个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)
<type 'str'>