如何在Python中访问指针的指针值?
我有一个Python中的指针声明:
numberOfThings = ctypes.c_int32()
indexes = ctypes.c_int32()
如果我打印这些值:
print numberOfThings.value
print indexes.value
我得到了:
0
0
我调用了一个函数:
the_Dll.doSomeThing(ctypes.byref(numberOfThings), ctypes.byref(indexes))
如果我现在打印这些值:
print "numberOfThings values", numberOfThings.value
print "indexes values", indexes.value
我得到了:
numberOfThings values 3
indexes values 147107816
这个索引是一个指向指针的指针,但我该如何获取索引的值呢?我的目标是循环遍历numberOfThings的数量,并为每个numberOfThings打印索引的值,像这样:
for i in range(numberOfThings.value):
print 'Value of indexes', how to access indexes real value?
有没有人知道怎么解决这个问题?谢谢!
2 个回答
0
我觉得我们可以先创建一个指针,而不是一个整型(int32):
numberOfThings = ctypes.c_int32()
indices = ctypes.c_void_p()
_Dll.doSomeThing(ctypes.byref(numberOfThings), ctypes.byref(indices))
然后我们可以把这个地址转换成一个正确类型的数组指针(这里假设是双精度浮点数):
ptrt = ctypes.POINTER(ctypes.c_double*numberOfThings.value)
indices = ptrt(indices.contents)
for n in indices.contents:
print n
1
来自Python的官方文档:
指针实例是通过在ctypes类型上调用pointer()函数来创建的:
>>>
>>> from ctypes import *
>>> i = c_int(42)
>>> pi = pointer(i)
>>>
指针实例有一个contents属性,这个属性返回指针所指向的对象,也就是上面提到的i对象:
>>>
>>> pi.contents
c_int(42)
>>>
所以如果我理解你的问题没错,你应该:
- 使用
pointer
而不是int32
类型 - 通过
variable.contents
属性来访问指针内容(也就是对指针进行解引用)。
更新
根据我们之前的讨论,这里是你可能解决方案的格式化版本:
numberOfThings = ctypes.c_int32()
indexes = ctypes.c_void_p()
_Dll.doSomeThing(ctypes.byref(numberOfThings),ctypes.byref(indexes))
ptrt = ctypes.POINTER(ctypes.c_double*numberOfThings.value)
mydblPtr = cast(indexes, ctypes.POINTER(ctypes.c_double*numberOfThings.value))
indexes = ptrt(mydblPtr.contents)
for content in indices.contents:
print content