列表:
Here's a piece of code exemplifying how to handle pointers and their addresses. The trick is to use ctypes.addressof (documented in the 2nd URL).
code00.py:
#!/usr/bin/env python
import ctypes as cts
import sys
CType = cts.c_float
CTypePtr = cts.POINTER(CType)
def ctype_pointer(seq): # Helper
CTypeArr = (CType * len(seq))
ctype_arr = CTypeArr(*seq)
return cts.cast(ctype_arr, CTypePtr)
def pointer_elements(addr, count): # Helper
return tuple(CType.from_address(addr + i * cts.sizeof(CType)).value for i in range(count))
def main(*argv):
seq = (2.718182, -3.141593, 1.618034, -0.618034, 0)
ptr = ctype_pointer(seq)
print(f"Pointer: {ptr}")
print(f"\nPointer elements: {tuple(ptr[i] for i in range(len(seq)))}") # Check if pointer has correct data
ptr_addr = cts.addressof(ptr.contents) # @TODO - cfati: Straightforward
print(f"\nAddress: {ptr_addr} (0x{ptr_addr:016X})\nElements from address: {pointer_elements(ptr_addr, len(seq))}")
ptr_addr0 = cts.cast(ptr, cts.c_void_p).value # @TODO - cfati: Alternative
print(f"\nAddresses match: {ptr_addr == ptr_addr0}")
if __name__ == "__main__":
print(
"Python {:s} {:03d}bit on {:s}\n".format(
" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32,
sys.platform,
)
)
rc = main(*sys.argv[1:])
print("\nDone.\n")
sys.exit(rc)
Notes:
Output:
(py_pc064_03.08_test0_lancer) [cfati@cfati-5510-0:/mnt/e/Work/Dev/StackExchange/StackOverflow/q078366208]> python ./code00.py
Python 3.8.19 (default, Apr 6 2024, 17:58:10) [GCC 11.4.0] 064bit on linux
Pointer: <__main__.LP_c_float object at 0x7203e97e7d40>
Pointer elements: (2.71818208694458, -3.1415929794311523, 1.6180340051651, -0.6180340051651001, 0.0)
Address: 125361127594576 (0x00007203E97A9A50)
Elements from address: (2.71818208694458, -3.1415929794311523, 1.6180340051651, -0.6180340051651001, 0.0)
Addresses match: True
Done.