Python ctypes的byref和pointer有啥区别,一文看懂

简介: Python ctypes的byref和pointer有啥区别,一文看懂

官方文档byref

官方文档pointer


byref(n)返回的相当于C的指针右值&n,本身没有被分配空间:


>>> from ctypes import *
>>> n = c_int(0)
>>> p = byref(n)
>>> pp = byref(p)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    pp = byref(p)
TypeError: byref() argument must be a ctypes instance, not 'CArgObject'

pointer返回的相当于指针左值T* p=&n,可以改变,可以取地址:


>>> from ctypes import *
>>> n = c_int(0)
>>> q = pointer(n)
>>> q.contents = c_int(1)
>>> qq = byref(q)
>>> dir(qq)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_obj']
>>> type(qq)
<class 'CArgObject'>                  #'CArgObject'是什么对象???
>>> qq
<cparam 'P' (010AD238)>
>>> q
<__main__.LP_c_long object at 0x010AD210>
>>> q.contents
c_long(1)


对于T**参数,通常你得构造一个pointer,然后byref传进去


以__开头并以__结束的属性(classdir 等)都是为内置方法(built-in method),唯独_obj不是


>>> qq._obj
<__main__.LP_c_long object at 0x010B8120>
>>> q
<__main__.LP_c_long object at 0x010B8120>


由以上执行代码可知,二维指针qq的_obj属性就是该二维指针的首地址,即指向q指针的地址


相关文章
|
4天前
|
程序员 开发者 Python
Python2.x与 3.x 版本区别
Python2.x与 3.x 版本区别
|
7天前
|
人工智能 Java 开发者
Python与Java:两大编程语言的联系与区别
Python与Java:两大编程语言的联系与区别
|
17天前
|
开发工具 Python
Python中return和yield的区别,面试官不讲武德
Python中return和yield的区别,面试官不讲武德
|
19天前
|
开发者 索引 Python
【Python 基础】remove、del和pop有什么区别?
【5月更文挑战第8天】【Python 基础】remove、del和pop有什么区别?
|
19天前
|
存储 Python
【Python 基础】“func”和“ func()”有什么区别?
【5月更文挑战第6天】【Python 基础】“func”和“ func()”有什么区别?
|
19天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
19天前
|
Python
【Python 基础】“is”和“==”有什么区别?
【5月更文挑战第6天】【Python 基础】“is”和“==”有什么区别?
|
19天前
|
Python
【Python 基础】列表(list)和元组(tuple)有什么区别?
【5月更文挑战第6天】【Python 基础】列表(list)和元组(tuple)有什么区别?
|
19天前
|
Python
在Python Web开发过程中:`is`和`==`在Python中的区别是什么?
【4月更文挑战第25天】Python的`is`与`==`用于比较。`is`检查对象是否相同(内存地址一致),而`==`检查值是否相等。例如,`a = [1, 2, 3]`,`b = a`,`c = [1, 2, 3]`,则`a is b`和`a == b`均为True,但`a is c`为False,`a == c`为True,因`a`和`b`引用同一对象,而`a`和`c`值虽等但对象不同。
12 1
|
19天前
|
XML 存储 数据处理
tsv、csv、xls等文件类型区别及处理(python版)
tsv、csv、xls等文件类型区别及处理(python版)