如果您曾经使用过C或C ++等低级语言,那么您可能已经听说过指针。指针允许您在部分代码中创建高效率。它们也会给初学者带来困惑,并且可能导致各种内存管理错误,即使对于专家也是如此。那么在Python中有指针的存在吗?
指针广泛用于C和C ++。本质上,它们是保存另一个变量的内存地址的变量。有关指针的更新,可以考虑在C指针上查看此概述。
为什么Python没有指针?
实际上指针为何不存在的原因现在还不知道,也许指针违背了Python的禅宗。指针鼓励隐含的变化而不是明确的变化。但通常情况下,它们很复杂而不是很简单,特别是对于初学者。更糟糕的是,当他们用指针指向自己的方法,或做一些非常危险的事情,比如从你无法获取的的一些变量中读取数据。
Python更倾向于尝试从用户那里抽象出内存地址来实现具体细节,所以Python通常关注可用性而不是速度。因此,Python中的指针并没有多大意义。但是在有些情况下,Python会为您提供使用指针的一些好处。
想要理解Python中的指针,需要理解Python实现指针功能的具体细节。简单来说,需要了解这些知识点:
不可变对象和可变对象【Python中的对象】
Python变量/名称【Python中的变量】
【在Python中模拟实现指针】
这玩意太难排版,凑合吧c 的调用方式如下
void test(char**p, int* len)
char* p = malloc(0x1000)
int len = 0x1000
test(&p, &len)
DebugPrint("size is %d ", len)
DumpHex(p, len)
python 呼叫test
func = CDLL('path').test
functype = CFUNCTYPE(c_void, c_void_p, c_void_p)
func = functype(CDLL('path').test)
data = create_string_buffer(0x1000)
len = c_uint64(0x1000)
func(byref(c_int64(addressof(data))), byref(len)) # 如果32位机器的话data 的地址转化为c_int32
data = data[:len.value] # 将字节码重新组装。 data 本身存储的是c_array_0x1000 . 不是python 的bytes类型。
ctypes pyobjc 这种库自身做了一个桥接。 很多虽然python能访问的类型,并不是python原生的类型。
需要很细心的转化为原生类型后,就大胆的使用吧。