542505989 发表于 2015-4-28 08:52:29

【转】python中使用 C 类型的数组以及ctypes 的用法

  【转自】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;
    }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]
查看完整版本: 【转】python中使用 C 类型的数组以及ctypes 的用法