Python:如何增加ctypes POINTER实例

时间:2011-07-14 11:03:52

标签: python pointers ctypes

假设p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))

因此,我们有p.contents.value == "f"

如何直接访问和操作(例如增加)指针?例如。比如(p + 1).contents.value == "o"

2 个答案:

答案 0 :(得分:7)

您必须使用索引:

>>> p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))
>>> p[0]
'f'
>>> p[1]
'o'
>>> p[3]
'\x00'

查看ctypes documentation以了解有关使用指针的更多信息。

更新:似乎不是您需要的。那么,让我们尝试另一种方法:首先将指针强制转换为void,然后将其强制转换为LP_c_char:

In [93]: p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))

In [94]: void_p = ctypes.cast(p, ctypes.c_voidp).value+1

In [95]: p = ctypes.cast(void_p, ctypes.POINTER(ctypes.c_char))

In [96]: p.contents
Out[96]: c_char('o')

也许它不优雅但它有效。

答案 1 :(得分:4)

回到这里之后,我发现@MichałBentkowski的答案对我来说仍然不够,因为它没有修改原始指针。

这是我目前的解决方案:

a = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))
aPtr = ctypes.cast(ctypes.pointer(a), ctypes.POINTER(c_void_p))
aPtr.contents.value += ctypes.sizeof(a._type_)

print a.contents