指针
来源:互联网 发布:javascript读取excel文件 编辑:程序博客网 时间:2024/05/29 16:47
在很多C语言编写的函数里,大部分都需要传递指针,比如给函数里传送值进去,或者从函数里返回多个值。在Python里想要跟C函数交互,那么需要模拟指针的类型,才可以实现这种梦想。值得注意的是ctypes已经实现了这个梦想,只要使用它定义的函数pointer()就可以。如下面的例子:
#windows应用程序
#开发人员:蔡军生(QQ:9073204) 深圳 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函数的指针了。需要注意的是i和pi是两个不同的对象,同时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函数就是轻而易举的事情。
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 指针
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- jQuery 增加 删除 修改select option .
- 给定一个二进制数,要求循环移位,在原二进制数中操作(C语言)
- 读写外挂
- Windows线程同步
- 指针
- ndroid 最火框架XUtils
- C语言的字符串转为OC中的字符串,控制台输入用户名和密码,判断输入的用户名是否是@“Frank”, 密码 是否是 @“lanou”, 如果用户名和密码都正确,则输出登录成功, 否则输出登录失败.
- c++静态库和动态库
- read 系统调用剖析 (vfs分析 address_space page cache)
- 随机为一维数组赋值,找出其中的第二大值
- 【菜鸟】 回忆初中及学编程中艰辛过程、感言
- c++对象模型
- String、StringBuffer与StringBuilder之间区别