zoukankan      html  css  js  c++  java
  • 指针

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

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

  • 相关阅读:
    为什么我的Android SDK Manager中只显示已安装的package?
    解决Android Studio Gradle Build特别慢的问题
    一款不错的取色器
    Android Studio没有导包快捷键怎么办
    Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? Android Studio快捷键之代码提示
    安卓动画总结【非原创】
    ButterKnife-5.1.2.jar(较低版本的ButterKnife)使用方法
    【转】调用getActionBar()报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar
    spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件)转
    详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4830216.html
Copyright © 2011-2022 走看看