Python中调用C函数时,如何获取指针参数指向的值?
c:
void test(int* a, int* b)
python:
a = c_int(0)
b = c_int(0)
test(byref(a), byref(b))
调用后 a,b 都已经被赋值了;
a,b 的类型是 <class ‘ctypes.c_long’>
byref 处理后的类型是 <class ‘CArgObject’>
如何才能从指针中拿到真正的值呢?
Python中调用C函数时,如何获取指针参数指向的值?
解引用
*a
*b
在Python里调用C函数,要拿到指针参数指向的值,核心是用ctypes库。这里的关键是:在调用C函数前,用ctypes类型正确声明参数和返回类型;调用后,通过.value属性访问指针指向的数据。
下面是一个完整的例子。假设我们有一个C库函数,它接受一个int*参数,并在函数内部修改这个指针指向的值。
1. 首先,创建C库文件 (example.c):
// example.c
void modify_value(int *p) {
if (p) {
*p = 42; // 修改指针指向的值为42
}
}
2. 编译成共享库:
gcc -shared -fPIC -o libexample.so example.c
(Windows用MinGW:gcc -shared -o example.dll example.c)
3. Python调用代码:
import ctypes
# 1. 加载库
lib = ctypes.CDLL('./libexample.so') # Windows用 './example.dll'
# 2. 声明函数参数和返回类型
lib.modify_value.argtypes = [ctypes.POINTER(ctypes.c_int)]
lib.modify_value.restype = None
# 3. 准备一个c_int变量,并获取它的指针
value = ctypes.c_int(0) # 初始化为0
value_ptr = ctypes.pointer(value)
print(f"调用前: {value.value}") # 输出: 0
# 4. 调用C函数,传入指针
lib.modify_value(value_ptr)
# 5. 通过.value获取指针指向的新值
print(f"调用后: {value.value}") # 输出: 42
关键点:
ctypes.POINTER(ctypes.c_int)声明了int*参数类型。ctypes.pointer()或ctypes.byref()可以获取变量的指针。byref()更轻量,但pointer()更通用。- 调用后,直接用
value.value就能拿到更新后的值。
如果C函数需要处理字符串(char*),方法类似,用ctypes.c_char_p,并通过ctypes.string_at()或.value.decode()来获取字符串内容。
总结:用ctypes正确声明指针类型,调用后访问.value属性。
不太明白啊…
我输出了下, 就只是一个类似地址的值 c_long(60654488), 这并不是真正的结果
a.value
b.value
.value 也是数字地址
传进去是一个 int 指针,c 函数对这个指针进行了处理,最终是一个字符串
如果知道怎么把指针地址的值取出来就稳了
只能传指针的指针
就像你想改变变量,就需要传变量的指针,那需要改变指针,就要传指针的指针
c 改变了地址, python 不知道咋获取
这个是不是要*两次才能取到实际的赋值。
已解决,问题在 c 函数的传参上
int* b,是一个指针地址, 不是 int 参数

