如何在Python中访问指针的指针值?

2 投票
2 回答
8825 浏览
提问于 2025-04-18 12:19

我有一个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)
 >>>

所以如果我理解你的问题没错,你应该:

  1. 使用pointer而不是int32类型
  2. 通过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

撰写回答