导入C类型库
1 | from ctypes import * |
常用的C类型
c_int、c_long、c_int32
– C 类型的long int,这两个类型完全相同。
– python用int与之相应,但c_int的取值范围是32 bit的整数 。
– 占用4字节内存
c_int64
– 64 bit 整数,占用 8 字节内存
– python 用 int 与之相应
c_double、c_float
– C 类型的double, 这两个名字( c_double、c_float 完全相同 )
– 占用 8 字节内存
– python 用 float 与之相应
c_byte
– C 类型的byte, python 用 int 与之相应
– 占用1字节内存
c_char
– C的8 bit字符型
c_wchar
– C的unicode字符
备注
1 | ctypes模块 |
生成类似C的数组
python原生数组list
1 | a = [ 0 ] * 10 |
生成10元素的c_int类型的数组
格式一:1
2
3
4
5 from ctypes import *
a = ( c_int * 10) ()
for i in range(0, len(a)):
print( a[i], end=" ")
输出:0 0 0 0 0 0 0 0 0 0
格式二:1
2
3
4
5
6from ctypes import *
myArr10 = c_int * 10
a = myArr10()
for i in range(0, len(a)):
print( a[i], end=" ")
输出:0 0 0 0 0 0 0 0 0 0
c_double 的数组定义与上面相似
如何使用 C 类型的数组
对整数数组倒序的程序
1 | #coding=gbk |
求倒序字符串
1 | #coding=gbk |
小结
– 从这个程序我们看到 对整数数组及 unicode 字符数组 的倒序,我们用的是相同的arrReverse 函数。
– 调用 arrReverse 函数时,传递元素个数 N 时,如果是 c_wchar ( unicode ) 字符数组时, 如记住最后一个元素是 NULL 这个问题。
– 您会发现,我们这里编的程序很像 C 语言的指针,只不过,我们不需要手工释放动态申请的数组。
– 但是您的算法中若用了大量的动态数组,等不及垃圾自动回收,而急于想释放数组占用的空间时,请使用 del ( ar )即可。
– 最后一点: C 语言关于字符串的操作,常 使用指针的移动, 我们在 python 中移动的是数组的下标,这是作程序移植时常用的方法。
C类型的数组 与 python 的 list 用法上有什么区别和联系呢?
– C 类型的数组的长度是不可变 的。
– C 类型数组的元素是可变的,即可以读写的
– C 类型数组的元素是有类型的,即: 它的每个元素的类型是相同的, 而 python 的 list 的元素可以是相同类型,也可以是不同类型 。
– C 类型数组除了不能用 形如 ar[ 3:5 ] = [] 格式的语句来删除某个子数组
– C 类型数组的切片:
如 x = ar[3:5]
此时 x 是一个全新的 数组,它是原数组的完全拷贝, 此时 x 有两个元素:
x[0] 中存的是 ar[3]的值
x[1] 中存的是 ar[4]的值
此后,改变 x[0] 时, ar[3] 不会改变; 改变 ar[3] 的值,也不会改变 x[0] 的值。