指针

来源:互联网 发布:javascript读取excel文件 编辑:程序博客网 时间:2024/05/29 16:47

在很多C语言编写的函数里,大部分都需要传递指针,比如给函数里传送值进去,或者从函数里返回多个值。在Python里想要跟C函数交互,那么需要模拟指针的类型,才可以实现这种梦想。值得注意的是ctypes已经实现了这个梦想,只要使用它定义的函数pointer()就可以。如下面的例子:

#windows应用程序

#开发人员:蔡军生(QQ9073204) 深圳  2014-8-15

from ctypes import *

#创建指针

i = c_int(88)

pi = pointer(i)

 

print('pi:', pi)

print('pi.contents:', pi.contents)

print('pi is pi:', pi is pi)

print('pi is i:', pi is i)

print('pi.contents is pi.contents:', pi.contents is pi.contents)

 

#给指针赋值

i = c_int(3721)

pi.contents = i

print('pi.contents:', pi.contents)

print('pi[0]:', pi[0])

 

#创建空指针

null_ptr = POINTER(c_int)()

print('null_ptr:', bool(null_ptr))

运行这个例子,输出内容如下:

pi: <__main__.LP_c_long object at 0x00948F30>

pi.contents: c_long(88)

pi is pi: True

pi is i: False

pi.contents is pi.contents: False

pi.contents: c_long(3721)

pi[0]: 3721

null_ptr: False

在这个例子里,先创建c_int(88)对象,然后把这个对象通过pointer(i)函数转换指针对象pi,这时pi就是一个可以传递给C函数的指针了。需要注意的是ipi是两个不同的对象,同时pi里的内容contents每调用一次都会创建新的实例返回。指针里返回的内容可以通过pi.contents来访问,这个属性里保存了指针的内容。当你想修改指针里的值时,可以直接给pi.contents来赋值。另外,如果从C函数里返回的值是数组方式,也可以通过索引的方式来访问指针,比如pi[0]的方式,在这里就是访问了一个元素的数组。它的索引值跟C是一样的,从0开始计算。当然,当你访问一个元素不存在就会引发异常。有时候需要传递一个NULL空指针给函数,或者函数某种条件没有达到返回NULL空指针。在ctypes里构造一个空指针,就不能使用pointer()函数来构造了,使用POINTER()来构造,构造一个整数的空指针:POINTER(c_int)()。当判断函数里返回的空指针时,采用强制转换为布尔值来判断( bool(null_ptr)),这时空指针的布尔值为False。如果只是把一个对象以指针的方式传递给C函数使用,那么有一种更高效的方法,就是通过函数byref(obj)的方式来转换。通过这个例子,我们学会指针创建、指针值获取、数组指针的返回、空指针创建和判断。有了模拟指针这个强大的工具,对调用有指针的C函数就是轻而易举的事情。

0 0