指针

指针

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

非常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功能是很容易做到。

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116949.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux netstat命令详解

    Linux netstat命令详解简介Netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态(InterfaceStatistics),masquerade连接,多播成员(MulticastMemberships)等等。输出信息含义执行netstat后,其输出结果为ActiveInternetconnections(w/oservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatetcp02210.34.6.

    2022年5月30日
    30
  • 实现一个基于tcc/tlink的简单的编译链接工具

    实现一个基于tcc/tlink的简单的编译链接工具

    2021年9月4日
    68
  • linux移动文件到另一个文件夹「建议收藏」

    linux移动文件到另一个文件夹「建议收藏」复制指定目录下的全部文件到另一个目录中1.文件及目录的复制是经常要用到的。linux下进行复制的命令为cp。假设复制源目录为dir1,目标目录为dir2。怎样才能将dir1下所有文件复制到dir2下了如果dir2目录不存在,则可以直接使用cp-rdir1dir2即可。如果dir2目录已存在,则需要使用cp-rdir1/.dir2例://没有publicData…

    2022年8月23日
    4
  • 检测数据库连接泄漏的最佳方法

    检测数据库连接泄漏的最佳方法介绍数据库连接不是免费的,这就是首先使用连接池解决方案的原因。但是,单独的连接池并不能解决与管理数据库连接相关的所有问题。应用程序开发人员必须确保Connection在不再需要时关闭每一个。在幕后,连接池提供了一个逻辑事务,当它被关闭时,它会返回到池中,以便其他并发事务可以进一步重用它。当连接被获取而从未被关闭时,就会发生连接泄漏。何时应检测到连接泄漏?每个关系数据库都提供了一种检查底层连接状态的方法,因此可以轻松打开一个新的SQL终端并检查是否有任何悬空连接。但是,这种简约的方法是

    2022年9月19日
    0
  • jedis 集群_iis配置api

    jedis 集群_iis配置api项目中会常用到redis,但JedisCluster的使用api还是比较多,经常可能会记不太清楚,故这里将大部分JedisCluster的api贴出来,供大家参考。一、redis在工作是一个常见的工具,这里对redis和springboot形成集群的使用。(1)引入对应redis集群所需要maven文件<dependency><groupId&g…

    2022年10月14日
    1
  • AssertValid函数学�

    AssertValid函数学�

    2021年12月8日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号