假設p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))
。我們有p.contents.value == "f"
。Python:如何增加一個ctypes POINTER實例
如何直接訪問和操作(例如增加)指針?例如。像(p + 1).contents.value == "o"
。
假設p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))
。我們有p.contents.value == "f"
。Python:如何增加一個ctypes POINTER實例
如何直接訪問和操作(例如增加)指針?例如。像(p + 1).contents.value == "o"
。
你必須使用索引:
>>> p = ctypes.cast("foo", ctypes.POINTER(ctypes.c_char))
>>> p[0]
'f'
>>> p[1]
'o'
>>> p[3]
'\x00'
看一看ctypes documentation,以瞭解更多有關使用指針。
UPDATE:它似乎不是你所需要的。讓我們,然後,嘗試另一種方法:先投的指針無效,增加它,然後將它轉換回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'。如果'p'是'c_void_p',我可以做'p.value + = 1'。 – Albert
@Albert,我已經更新了我的答案。 –
回到這之後,我發現@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
這並不總是用C這麼熱的想法;看到有人想把它應用到Python讓我有點害怕。 –