是否可以使用ctypes进行指针运算?
首先,让我告诉你我在C
尝试做什么#include <stdio.h>
struct Foo {
short *Bar;
short *end_Bar;
};
int main() {
short tab[3] = {1,2,3};
struct Foo foo;
foo.Bar = tab;
foo.end_Bar = foo.Bar + 2; // Pointer arithmetic
short *temp = foo.Bar;
while(temp != foo.end_Bar)
printf("%hi", *(temp++));
printf("%hi", *(foo.end_Bar));
return 0;
}
现在您了解我正在做的是创建一个整数数组,并在结构中保留引用两个指针。一个指针位于开头,一个指针位于末尾,代替保持第一个指针和数组的长度。
现在在Python中,我有一个继承自 ctypes.Structure 的对象,以及两个 ctypes.POINTER(ctypes.c_short)类型的成员。
import ctypes
class c_Foo(ctypes.Structure):
_fields_ = [
("Bar", ctypes.POINTER(ctypes.c_short)),
("end_Bar", ctypes.POINTER(ctypes.c_short))
]
if __name__ == "__main__":
tab = [1,2,3]
foo = c_Foo()
foo.Bar = (c_short * len(tab))(*tab)
foo.end_Bar = foo.Bar + 2 # TypeError, unsupported operand
所以现在问题。用ctypes 可以做指针算法吗?我知道您可以通过索引访问数组的值,但我不想这样,因为我不想在我的结构中使用长度引用。
答案 0 :(得分:6)
这是复杂的,但这会在c_short
中的一个字节偏移处计算一个tab
对象,该对象共享其缓冲区,然后获取指向它的指针:
from ctypes import *
class c_Foo(Structure):
_fields_ = [
("Bar", POINTER(c_short)),
("end_Bar", POINTER(c_short))
]
tab = (c_short*3)(1,2,3)
foo = c_Foo()
foo.Bar = tab
foo.end_Bar = pointer(c_short.from_buffer(tab,sizeof(c_short)*2))
print(tab[2])
print(foo.Bar[2])
print(foo.end_Bar[0])
tab[2] = 4
print(tab[2])
print(foo.Bar[2])
print(foo.end_Bar[0])
3 3 3 4 4 4