2011-07-14 23 views
6

我无法理解Python ctypes中LP_ *(例如LP_c_char)和* _p(例如c_char_p)指针之间的区别。有文件区分它们吗?ctypes中LP_ *指针和* _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'> 

换句话说,指针已经在过程的某个地方被取消引用。

回答

9

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

表示与c的char *数据类型时,它指向一个零终止的字符串。对于也可指向二进制数据的通用字符指针,必须使用POINTER(c_char)。因为它假设你指的是一个字符串,它通常是当你使用char *在C. LP_c_char没有这样的假设的情况下

c_char_p被映射到Python的str类型。

基本的数据类型,当为外函数调用返回的结果,或者,例如,通过检索结构字段成员或阵列的物品,被透明地转换为本机Python类型。换句话说,如果一个外部函数有一个c_char_p的类型,你总是会收到一个Python字符串,而不是一个c_char_p实例。