Python双指针

Python双指针,python,ctypes,Python,Ctypes,我试图从指向浮点数组的指针获取值,但在python中它返回为c_void_p C代码 double v; const void *data; pa_stream_peek(s, &data, &length); v = ((const float*) data)[length / sizeof(float) -1]; 迄今为止的Python import ctypes null_ptr = ctypes.c_void_p() pa_stream_peek(stream,

我试图从指向浮点数组的指针获取值,但在python中它返回为c_void_p

C代码

double v;
const void *data;  
pa_stream_peek(s, &data, &length);  
v = ((const float*) data)[length / sizeof(float) -1];
迄今为止的Python

import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 

问题是null_ptr有一个int值(内存地址?),但无法读取数组

我的ctypes已经生锈了,但我相信你想要的是指针(c_float)而不是c_void_p

所以试试这个:

null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc

您可能还希望使用byref传递null_ptr,例如

pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))

要以模仿您的C代码的方式使用CType,我建议(我已经不实践了,这是未经测试的):


当您在不使用ctypes.pointer或ctypes.byref的情况下传递指针参数时,其内容只需设置为内存地址的整数值(即指针位)。这些参数应使用
byref
(或
pointer
)传递,但
byref
的开销较小:


在传球时发出的欢呼声(c_float)非常有效。。我还添加了更新类型包装器的功能,比如从pa_stream_peek.argtypes=[POINTER(pa_stream),POINTER(POINTER(None)),POINTER(c_size_t)]到pa_stream_peek.argtypes=[POINTER(pa_stream),POINTER(POINTER(c_float)),POINTER(c_size_t)],给出数据=指针(c_float)([pa_stream,data,ctypes.c_ulong(length))v=data[0]
vdata = ctypes.c_void_p()
length = ctypes.c_ulong(0)
pa_stream_peek(stream, ctypes.byref(vdata), ctypes.byref(length))
fdata = ctypes.cast(vdata, POINTER(float))
data = ctypes.pointer(ctypes.c_float())
nbytes = ctypes.c_sizeof()
pa_stream_peek(s, byref(data), byref(nbytes))
nfloats = nbytes.value / ctypes.sizeof(c_float)
v = data[nfloats - 1]