【问题标题】:Python: how to increment a ctypes POINTER instancePython:如何增加 ctypes POINTER 实例
【发布时间】:2011-07-14 11:03:51
【问题描述】:

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

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

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

【问题讨论】:

  • 这在 C 语言中并不总是那么热门;看到有人想把它应用到 Python 上,我有点害怕。

标签: python pointers ctypes


【解决方案1】:

你必须使用索引:

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

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

UPDATE:看来这不是你需要的。那么,让我们尝试另一种方法:首先将指针转换为 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')

也许它并不优雅,但它确实有效。

【讨论】:

  • 这并不能真正回答我的问题。我真的很想修改/增加p。如果pc_void_p,我可以使用p.value += 1
【解决方案2】:

回到这一点后,我发现@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2022-12-10
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多