Когда вы вызываете c_int(val1)
, вы создаете новый c_int
объект. Этот объект содержит целочисленную переменную в стиле C. Вы можете легко получить указатель на него, используя byref
для вызовов функций. Тип Python int
, с другой стороны, не является изменяемым и не может быть изменен, даже если вы найдете его адрес;таким образом val1
и var2
не могут быть обменены. Таким образом, ваш пример должен выглядеть примерно так:
from ctypes import *
var1 = c_int(10)
var2 = c_int(20)
lib = cdll.LoadLibrary('./swaplib.so')
lib.swap_addr.argtypes = [c_void_p, c_void_p]
print ("Before swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
lib.swap_addr( byref(var1), byref(var2) )
print ("After swap var1 and var2 is " + str(var1.value) + " & " + str(var2.value))
Кстати, POINTER
создает тип указателя, который точно одинаков как для Addr_Var1
, так и Addr_Var2
. До тех пор, пока вы не создадите значения того типа, на который они указывали в разных местах, в аргументах swap_addr
, и они были немедленно отброшены (вполне возможно, в неправильном порядке).