楔子

我们知道可以使用ctypes调用扩展模块,主要是调用扩展模块中使用C编写好的函数,但这些函数肯定都是需要参数的,还有返回值,不然编写扩展模块有啥用呢。那么问题来了,不同的语言变量类型不同,所以python能够直接往C编写的函数中传参吗?显然不行,所以ctypes还提供了大量的类,帮我们将python中的类型转成C语言中的类型。

python类型与C语言类型之间的转换

我们说了,python中类型不能直接往C语言的函数中传递(整型是个例外),那么ctypes就提供了很多的类可以帮助我们将python的类型转成C语言的类型。常见的类型分为以下几种:数值、字符、指针

数值类型转换

c语言的数值类型分为如下:

int:整型

unsigned int:无符号整型

short:短整型

unsigned short:无符号短整型

long:长整形

unsigned long:无符号长整形

long long:64位机器上等同于long

unsigned long long:等同于unsigned long

float:单精度浮点型

double:双精度浮点型

long double:看成是double即可

_Bool:布尔类型

ssize_t:等同于long或者long long

size_t:等同于unsigned long或者unsigned long long

import ctypes

# 下面都是ctypes中提供的类,将python中的对象传进去,就可以转换为C语言能够识别的类型

print(ctypes.c_int(1)) # c_long(1)

print(ctypes.c_uint(1)) # c_ulong(1)

print(ctypes.c_short(1)) # c_short(1)

print(ctypes.c_ushort(1)) # c_ushort(1)

print(ctypes.c_long(1)) # c_long(1)

print(ctypes.c_ulong(1)) # c_ulong(1)

# c_longlong等价于c_long,c_ulonglong等价于c_ulong

print(ctypes.c_longlong(1)) # c_longlong(1)

print(ctypes.c_ulonglong(1)) # c_ulonglong(1)

print(ctypes.c_float(1.1)) # c_float(1.100000023841858)

print(ctypes.c_double(1.1)) # c_double(1.1)

# 在64位机器上,c_longdouble等于c_double

print(ctypes.c_longdouble(1.1)) # c_double(1.1)

print(ctypes.c_bool(True)) # c_bool(True)

# 相当于c_longlong和c_ulonglong

print(ctypes.c_ssize_t(10)) # c_longlong(10)

print(ctypes.c_size_t(10)) # c_ulonglong(10)

字符类型转换

c语言的字符类型分为如下:

char:一个ascii字符或者-128~127的整型

wchar:一个unicode字符

unsigned char:一个ascii字符或者0~255的一个整型

import ctypes

# 必须传递一个ascii字符并且是字节,或者一个int,来代表c里面的字符

print(ctypes.c_char(b"a")) # c_char(b'a')

print(ctypes.c_char(97)) # c_char(b'a')

# 传递一个unicode字符,当然ascii字符也是可以的,并且不是字节形式

print(ctypes.c_wchar("憨")) # c_wchar('憨')

# 和c_char类似,但是c_char既可以传入字符、也可以传整型,而这里的c_byte则要求必须传递整型。

print(ctypes.c_byte(97)) # c_byte(97)

print(ctypes.c_ubyte(97)) # c_ubyte(97)

指针类型转换

c语言的指针类型分为如下:

char *:字符指针

wchar_t *:字符指针

void *:空指针

import ctypes

# c_char_p就是c里面字符数组指针了

# char *s = "hello world";

# 那么这里面也要传递一个bytes类型的字符串,返回一个地址

print(ctypes.c_char_p(b"hello world")) # c_char_p(2082736374464)

# 直接传递一个unicode,同样返回一个地址

print(ctypes.c_wchar_p("憨八嘎~")) # c_wchar_p(2884583039392)

# ctypes.c_void_p后面演示

至于其他的类型,比如整型指针啊、数组啊、结构体啊、回调函数啊,ctypes都支持,我们后面会介绍。

python写游戏与c语言转化,使用ctypes实现python类型和C语言类型之间的相互转化相关推荐

  1. 如何用python写游戏_一步步教你怎么用python写贪吃蛇游戏

    目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...

  2. 手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏

    Python 飞机大战|10 分钟学会用 python 写游戏 2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年! 除了在科学计算领域 python 有用武之地之外, 在 ...

  3. python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】

    前言 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课 ...

  4. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...

    原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...

  5. 我的世界python写游戏_用python写游戏之 Give it up

    <永不言弃 Give It Up>,这是一款极具虐心色彩的音乐题材闯关游戏. 这篇文章就来分析这款游戏原理,并用python写出来一个简易版.废话不多说,直接开始分析. 游戏元素,暂且把主 ...

  6. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  7. python如何编游戏_手把手教你用python写游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,项目来自 ...

  8. 用python写数字_用python 写游戏之数字华容道

    当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏.写2048游戏的时候,又想起了这个游戏,想着来研究一下. 游戏玩法 用尽量少的步数,尽量短的时间,将棋盘上的数字方块,按照 ...

  9. python写的游戏怎么给别人玩-用python写游戏脚本原来这么简单

    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西. 当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成.游戏脚本其实并 ...

最新文章

  1. CTFshow php特性 web115
  2. 深入探究函数返回局部变量
  3. 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)
  4. mockito mock void方法_Spock如何模拟抽象类方法
  5. java父类转子类_java中什么是继承,和继承的接口的关系?
  6. Scikit-learn:模型选择之调参grid search
  7. !HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
  8. Python基础教程,Python入门教程(非常详细)
  9. 正版破解软件下载站大全(转载
  10. Linux常用软件包安装工具及配置方法(apt-get, pip, dpkg)
  11. OSChina 周一乱弹 ——我们不应歧视任何语言,她们都是萌娘!(有图有真相)...
  12. 读书之二 --《程序员修炼之道》
  13. 笔记本计算机的清洁保养知识,笔记本电脑怎么清洁卫生 笔记本清理灰尘要注意什么...
  14. 拜读刘天斯的一个开源项目
  15. 删除Oracle表空间,释放硬盘空间
  16. 蚪侠-远程泛目录[泛域名+泛目录+泛内页]-[代码+汉字]干扰-字体繁简切换-蜘蛛欺骗-主动推送_模板版-V25版
  17. Windows API一日一练 29 SelectObject和DeleteObject函数
  18. HTTP请求响应的5种状态
  19. Android两种时间轴实现
  20. 关于金额转化为大写的小程序

热门文章

  1. Java Swing打猎射击游戏编程代码下载
  2. 反锐化掩膜_图像反锐化掩膜算法研究解析.doc
  3. 全志A31下5M的CMOSCamera移植修改记录表
  4. React之生命周期-forceUpdate
  5. ODIS是一款专业的多功能车辆诊断系统
  6. oracle erp库位设置,快麦ERP是如何实施仓库库位规划的?
  7. 使用Mahout搭建推荐系统之入门篇-Mahout实战
  8. [编程教程]郁金香2013网授VC++ 2008 详解 [ 50课 ]
  9. mac 编译源码安装 opencv
  10. 使用Project客户端和Project Server进行项目管理