在Python中調用ctypes接收指針,可以使用ctypes模塊的POINTER
和byref
方法。
首先,需要導入ctypes模塊,并定義一個類似于C語言中的結構體或者使用c_void_p
來表示指針類型。
例如,假設有下面的C語言代碼:
#include <stdio.h>
void add_numbers(int* a, int* b, int* result) {
*result = *a + *b;
}
在Python中,可以使用ctypes來調用這個函數:
import ctypes
# 定義一個結構體或指針類型
class IntPointer(ctypes.Structure):
_fields_ = [("value", ctypes.POINTER(ctypes.c_int))]
# 加載動態鏈接庫
lib = ctypes.CDLL("your_library_path")
# 獲取函數并設置參數類型
add_numbers = lib.add_numbers
add_numbers.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)]
# 創建參數并傳入函數
a = ctypes.c_int(5)
b = ctypes.c_int(3)
result = ctypes.c_int()
add_numbers(ctypes.byref(a), ctypes.byref(b), ctypes.byref(result))
print(result.value) # 輸出結果:8
在上述代碼中,首先定義了一個類IntPointer
,它包含一個名為value
的指針成員。然后,使用ctypes.Structure
來聲明這個結構體。
接下來,加載動態鏈接庫并獲取add_numbers
函數。使用argtypes
屬性設置函數的參數類型,此處argtypes
的類型為ctypes.POINTER(ctypes.c_int)
表示指向整數的指針類型。
然后,創建整數參數a、b和結果result,并使用ctypes.byref
將其傳遞給add_numbers
函數。
最后,通過result.value
訪問結果。