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函数时,如何获取指针参数指向的值?

13 回复

解引用
*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 参数

回到顶部