Python:如何增加ctypes POINTER实例

Alb*_*ert 7 python ctypes pointers

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

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

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

Mic*_*ski 7

你必须使用索引:

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

查看ctypes文档以了解有关使用指针的更多信息.

更新:似乎这不是你需要的.那么,让我们尝试另一种方法:首先将指针强制转换为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')
Run Code Online (Sandbox Code Playgroud)

也许它不优雅,但它的工作原理.


Alb*_*ert 5

回到这个问题后,我发现 @Micha\xc5\x82 Bentkowski 的答案对我来说仍然不够,因为它没有修改原始指针。

\n\n

这是我当前的解决方案:

\n\n
a = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))\naPtr = ctypes.cast(ctypes.pointer(a), ctypes.POINTER(c_void_p))\naPtr.contents.value += ctypes.sizeof(a._type_)\n\nprint a.contents\n
Run Code Online (Sandbox Code Playgroud)\n