封装的指针类型,Pointer

Pointer像C++的只能指针,类比记忆

Pointer shared_ptr
ptr.contents *sptr
ptr sptr

需要注意的是

ctypes不会返回源对象,因为python会返回一个新包装的c_int容器。所以每一次返回的对象,也就是容器是不同的。

但是返回包含的对象是一样的。注意,指针只针对c结构类型。

修改指针的指向。

我们可以通过 修改属性 contents 来修改,其实也就是修改contents指针指向的对象,也就是contents指向的地址变了。

赋值给其他的就相当于我们重载了 c++的解指针的行为。

我们可以通过

p[0]

也就是类c语言指针的操作,当p的下标在合法范围内,就是有效的,如果是非法的,那么结果始终是一样的。

这样可以支持数组的操作,毕竟c语言里面数组和指针都可以进行下标操作。

p[0] = b

这里b必然是和p指针指向的相同。指针操作和c相同。但是必然要明白自己在操作什么,不要做出非法访问的行为。所以虽然这个是个指针,但是行为仍然是由编程者操作。

但是对于p对象和成员的操作可以看成是python的操作。

POINTER

在上面叙述之后,pointer方法不仅仅只是简单的创建一个指针对象,他需要创建一个指针类型的数据,那么这个操作就是有POINTER方法完成,这个方法接受任意一个ctypes类型,并且返回一个新的类型。

>>> PI = POINTER(c_int)
>>> PI
<class 'ctypes.LP_c_long'>
>>> PI(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected c_long instead of int
>>> PI(c_int(42))
<ctypes.LP_c_long object at 0x...>
>>>

所有的ctypes都继承自  _SimpleCData  。

调用pointer类型,传入的是ctypes类对象,那么返回的将是一个空指针。即NULL,NULL转换为bool将会是False


在我们进行解指针的时候会进行空判定,但是如果是指向的一个非法指针可能会导致python崩溃掉。

猜你喜欢

转载自blog.csdn.net/rubikchen/article/details/89481119