我无法理解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实例.
| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |