RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
python函数指针表 python的指针和c的指针

python ctypes 怎么处理函数返回的一般指针

test.c(动态库源代码)

创新互联公司-专业网站定制、快速模板网站建设、高性价比太原网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式太原网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖太原地区。费用合理售后完善,十年实体公司更值得信赖。

[cpp] view plain copy

// 编译生成动态库: gcc -g -fPIC -shared -o libtest.so test.c

#include stdio.h

#include string.h

#include stdlib.h

typedef struct StructPointerTest

{

char name[20];

int age;

}StructPointerTest, *StructPointer;

StructPointer test() // 返回结构体指针

{

StructPointer p = (StructPointer)malloc(sizeof(StructPointerTest));

strcpy(p-name, "Joe");

p-age = 20;

return p;

}

编译:gcc -g -fPIC -shared -o libtest.so test.c

call.py(python调用C语言生成的动态库):

[python] view plain copy

#!/bin/env python

# coding=UTF-8

from ctypes import *

#python中结构体定义

class StructPointer(Structure):

_fields_ = [("name", c_char * 20), ("age", c_int)]

if __name__ == "__main__":

lib = cdll.LoadLibrary("./libtest.so")

lib.test.restype = POINTER(StructPointer)

p = lib.test()

print "%s: %d" %(p.contents.name, p.contents.age)

最后运行结果:

[plain] view plain copy

[zcm@c_py #112]$make clean

rm -f *.o libtest.so

[zcm@c_py #113]$make

gcc -g -fPIC -shared -o libtest.so test.c

[zcm@c_py #114]$./call.py

Joe: 20

[zcm@c_py #115]$

python函数有哪些

1、print()函数:打印字符串;

2、raw_input()函数:从用户键盘捕获字符;

3、len()函数:计算字符长度;

4、format()函数:实现格式化输出;

5、type()函数:查询对象的类型;

6、int()函数、float()函数、str()函数等:类型的转化函数;

7、id()函数:获取对象的内存地址;

8、help()函数:Python的帮助函数;

9、s.islower()函数:判断字符小写;

10、s.sppace()函数:判断是否为空格;

11、str.replace()函数:替换字符;

12、import()函数:引进库;

13、math.sin()函数:sin()函数;

14、math.pow()函数:计算次方函数;

15、os.getcwd()函数:获取当前工作目录;

16、listdir()函数:显示当前目录下的文件;

17、time.sleep()函数:停止一段时间;

18、random.randint()函数:产生随机数;

19、range()函数:返回一个列表,打印从1到100;

20、file.read()函数:读取文件返回字符串;

21、file.readlines()函数:读取文件返回列表;

22、file.readline()函数:读取一行文件并返回字符串;

23、split()函数:用什么来间隔字符串;

24、isalnum()函数:判断是否为有效数字或字符;

25、isalpha()函数:判断是否全为字符;

26、isdigit()函数:判断是否全为数字;

27、 lower()函数:将数据改成小写;

28、upper()函数:将数据改成大写;

29、startswith(s)函数:判断字符串是否以s开始的;

30、endwith(s)函数:判断字符串是否以s结尾的;

31、file.write()函数:写入函数;

32、file.writeline()函数:写入文件;

33、abs()函数:得到某数的绝对值;

34、file.sort()函数:对书数据排序;

35、tuple()函数:创建一个元组;

36、find()函数:查找 返回的是索引;

37、dict()函数:创建字典;

38、clear()函数:清楚字典中的所有项;

39、copy()函数:复制一个字典,会修改所有的字典;

40、 get()函数:查询字典中的元素。

…………

python中,能对函数传递文件指针类型的参数吗

如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来…… 《在Matlab中把struct当成Python中的Dictionary使用》《Matlab和Python的几种数据类型的比较》)。

既然提到了MEX,就简单说一下:

一个Matlab可能形如

function ret=add3(a,b,c)

如果在C的层面实现这个函数,就会看到另一种景象:

void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[])

a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明Matlab函数的参数是传递指针的,而不是值传递。

纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了。

Python是开放源码的,我没有看。所以下面很多东西是猜的。

Python在函数的参数传递时用的什么手法?实验一下(使用ActivePython2.5):

首先介绍一个重要的函数:

help(id)

Help on built-in function id in module __builtin__:

id(...)

id(object) - integer

Return the identity of an object. This is guaranteed to be unique among

simultaneously existing objects. (Hint: it's the object's memory address.)

看最后括号里那句:Hint:it's the object's address.(它是对象的地址)

有了这个函数,下面的事情就方便多了。

a=0

id(a)

3630228

a=1

id(a)

3630216

可以看出,给a赋一次值,a的address就改变了。在C的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):

void * pa;

pa=malloc(sizeof(int));

*(int *)pa=0;

free(pa);

pa=malloc(sizeof(int));

*(int *)pa=1;

Python中每次赋值会改变变量的address,分配新的内存空间,所以Python中对于类型不像C那样严格要求。

下面看看Python函数参数传递时到底传的什么:

有一个函数:

def changeA(a):

... print id(a)

... a=100

... print id(a)

设定一个变量var1:

var1=10

id(var1)

3630108

changeA(var1)

3630108

3631012

var1

10

调用函数后,从两次print的结果可以看出,传递确实是地址。但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用print id(a)得到不同的结果),却没有改变实参的指向。在C的层面看也许类似下面的情节:

void changeA(void * pa)

{

pa=malloc(sizeof(int));

*(int *)pa=100;

free(pa);

}

精通C的你一眼就看出这个函数永远也改变不了它外面的世界。

也就是说虽然传递的是地址,但像changeA这样的函数改变不了实参的值。

也许会感到困扰?不,我已经在Matlab中习惯了。

一个最典型的例子就是Matlab中删除结构体成员的rmfield函数(参见《Matlab笔记三则》),

(Matlab版本7.0.1)

如果想删除结构体patient的name成员,用

rmfield(patient, 'name');

是永远达不到目的的(就像试图用双手抓住自己的领子,把自己提到空中);

迷途知返的做法是:

patient = rmfield(patient, 'name');


标题名称:python函数指针表 python的指针和c的指针
网址分享:http://lswzjz.com/article/hhhheo.html