设为首页 收藏本站
查看: 992|回复: 0

[经验分享] 【转】python中使用 C 类型的数组以及ctypes 的用法

[复制链接]

尚未签到

发表于 2015-4-28 08:52:29 | 显示全部楼层 |阅读模式
  【转自】http://hi.baidu.com/jxq61/blog/item/90037f272a9ae46c35a80fdc.html
  Python 在 ctypes 中为我们提供了类似C语言的数据类型,
  它的用途(我理解的)可能是:
  (1) 与 其他语言(如 C、Delphi 等)写的动态连接库DLL 进行交换数据,因为 python 的 数据与 DLL难以进行数据交换。
  (2) python 的字符串一旦形成,是不可变的,为了算法的需要,我们有时需要对字符串进行原位操作 ( in place ),而不想浪费另外的内存空间。
  (3) python 具有很简明的语法,人们乐于使用。在解决实际问题时,字符串的处理占据了很大的开发量。
       互联网上有很多有用的算法可以帮助我们解决问题,如果我们能用python 写类似于 C 语言的程序,就不需要用其他语去写扩展了。
       有人会问,既然如此,用C语言,不就好了吗?
        当然可作这种选择,在用 python 的优势在于:既用使用了C语言的优点,也使用了Python的最大优点: 垃圾自动回收,代码简洁等。
     
  一、 导入 C 类型 库
  from ctypes import *
  二、 常用的C 类型
  (1) c_int   、 c_long 、c_int32
        C 类型的long int ,这两个类型完全相同。
         python 用 int 与之相应 , 但c_int的取值范围是 32 bit 的整数 。
        占用 4 字节内存
     (2) c_int64
        64 bit 整数,占用 8 字节内存    , python 用 int 与之相应
     (2) c_double 、c_float
        C 类型的 double , 这两个名字( c_double 、c_float 完全相同 )
        占用 8 字节内存   
         python 用 float 与之相应
  (3) c_byte
        C 类型 的 byte ,   python 用 int 与之相应
        占用1字节内存
     (4) c_char
         C 的 8 bit 字符型   
  (5) c_wchar
        C 的 unicode 字符
  【注】


  ctypes模块
  C类型                       Python类型                        ctypes 类型
char                        1-character/string                c_char
wchar_t                     1-character/Unicode、string       c_wchar
char                        int/long                          c_byte
char                        int/long                          c_ubyte
short                       int/long                          c_short
unsigned short              int/long                          c_ushort
int                         int/long                          C_int
unsigned int                int/long                          c_uint
long                        int/long                          c_long
unsigned long               int/long                          c_ulong
long long                   int/long                          c_longlong
unsigned long long          int/long                          c_ulonglong
float                       float                             c_float
double                      float                             c_double
char *(NULL terminated)     string or none                    c_char_p
wchar_t *(NULL terminated) unicode or none                   c_wchar_p
void *                      int/long or none                  c_void_p
  当一个函数期望一个指针作为参数时,可以像这样调用
function_main( byref(parameter) ). //
  struct例子
下面的例子是定义一个结构
C语言例子
    struct beer_recipe
    {
    int amt_barley;
    int amt_water;
    };
   
Python例子
class beer_recipe(Structure):
    _fields_ = [
    ("amt_barley", c_int),
    ("amt_water", c_int),
    ]
   
   
Union结构例子
C语言例子
    union {
    long barley_long;
    int barley_int;
    char barley_char[8];
    }barley_amount;
  Python例子
class barley_amount(Union):
    _fields_ = [
    ("barley_long", c_long),
    ("barley_int", c_int),
    ("barley_char", c_char * 8),
    ]
  

  三、    生成类似C的数组
  目的:初值化一个具有 10 个元素 的数组,每个元素初值为0的
     
  (一) python 原生数组 list
  >>> a = [ 0 ] * 10
>>> for i in range(0, len(a)):
          print( a, end=" ")

  
0 0 0 0 0 0 0 0 0 0
>>>

  (二) 生成 10 元素的 c_int 类型的数组:
  
  
  格式一:
  
  >>> from ctypes import *
>>> a = ( c_int * 10) ()
>>> for i in range(0, len(a)):
        print( a, end=" ")
  
  
0 0 0 0 0 0 0 0 0 0
>>>
  
  格式二:
  
  >>> from ctypes import *
>>> M = 10
>>> a = ( c_int * M ) ()
>>> for i in range(0, len(a)):
    print( a, end=" ")
  
  
0 0 0 0 0 0 0 0 0 0
  
  格式三:
  
  >>> from ctypes import *
>>> myArr10 = c_int * 10
>>> a = myArr10( )
>>> for i in range(0, len(a)):
     print( a, end=" ")
  
  
0 0 0 0 0 0 0 0 0 0
  
  
  
  c_double 的数组定义与上面相似。
  
  
  
  四、如何使用 C 类型的数组 ?
  
  例 1 , 对整数数组倒序的程序
  
  #coding=gbk
from ctypes import *
# 定义 具有10个 c_int 元素的数组
# 编写一维数组的 倒序的程序
# 说明 : 本算法参照 网上基于指针的算法改写而成。
def outPut( A ):
    for i in range(0,N):
          print( A, end=" ")
    print ( "\n")
   
def arrReverse( A , N):
    i = 0 ; j = N-1
    while i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61414-1-1.html 上篇帖子: python开发_python中的函数定义 下篇帖子: python开发_python中for循环操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表