python用的是c语言_Python调用C语言之使用指针

之前讲了Python调用C语言的基本方法,但是只能进行最简单的操作。现在我们就来讲讲如何Python如何操作C语言指针。

掌握调用指针的方法,我们首先要了解2个函数byref和POINTER,还是先看看他们的doc吧

1.byref

Center

2.POINTER(这一定是个不合格的程序员写的,没有留doc

awkward.gif)

Center

好吧,byref翻译过来就是:返回一个C语言的指针,只能用作函数的参数,和C语言传入参数时使用&差不多的意思(个人理解哈)。POINTER没写doc,不过个人理解是将事物指针化,和C语言中初始化变量时使用 * 相当,不过不能用作参数。如果这部分有错请留言!!!

接下来我们看个实例吧。

Example 1:

首先附上DLL代码,代码中参数和返回值均指针化了

#include "stdafx.h"

#include

#define DLLAPI extern "C" _declspec(dllexport)

typedef struct Testdll

{

int a;

char* b;

}testdll;

DLLAPI testdll* test(testdll* t)

{

t->a=t->a+t->a;

printf("%d\n%s\n",t->a,t->b);

return t;

}

然后附上python代码,就是拿上一次的代码改了改,节约时间,勿喷!!

#coding=gbk

from ctypes import *

dllpath='C:\\Users\\***\\Documents\\Visual Studio 2010\\Projects\\EasyDll\\Release\\EasyDll.dll'

dll=CDLL(dllpath)

a=c_int(125)

b=c_char_p('Hello world,Hello Chengdu')

class testdll(Structure):

_fields_=[('a',c_int),

('b',c_char_p)]

t=testdll()#初始化结构体

t.a=a

t.b=b

dll.test.restype=POINTER(testdll)#确定test这个函数的返回值的类型

t=dll.test(byref(t))#执行函数

print t.contents.a

print t.contents.b

x=raw_input('any key to continue')

好吧,我们看见这个和第二部分的代码基本差不多。不同的地方有3个。

1.dll.test.restype中,test的返回值类型使用了POINTER函数,也就是说,如果一个链接库中函数返回值有指针,那么在Python中赋予函数返回值的时候就需要使用POINTER将结构体指针话

2.调用链接库的test函数时,使用了byref函数。意思若链接库里面的函数参数为指针,那么python中参数参数需要用byref取结构体地址

3.在获取结构体值的时候,指针类型结构体里面的值是在contents里面。如果python接受到一个指针类型的结构体,那么他们的值全部都在contents里面

但是,呵呵,一运行的时候你会发现一个非常非常奇怪的现象。

Center

为毛会这样,接收到的值全部为空????????????

我将代码进行一下小小的改动

Center

然后运行

Center

结果完全正确,我陷入了沉思~~~

为什么会这样?为了探究这个问题,我们再一次修改代码,添加一行如图画红圈所示。

Center

执行

Center

我可以看到,在第一个t=dll.test(byref(t))中,执行完了之后t其实就已经被释放掉了。至于原因,不再这里长篇大论了,后面再详谈~~~,大家暂时先注意一下这个问题就行了~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值