Python中的C指针算法

时间:2011-04-06 23:26:49

标签: python c arrays math pointers

我正在尝试将一个简单的C程序转换为Python,但由于我对C语言一无所知,而对Python有点了解,这对我来说很难......

我坚持使用C指针。

有一个函数接受无符号long int指针并将其值添加到while循环中的某些变量中:

uint32_t somename(const uint32_t *z) {
    while(....) {
        a += z[0]
        b += z[1]
        c += z[2]
        z += 3
    }
}

有人可以告诉我如何在python中完成同样的事情吗? (我根本不理解的部分是“z + = 3”)

我知道python中没有指针。 (至少不像C)但问题是我不知道C指针究竟做了什么,因此无法在python中实现这一点。

3 个答案:

答案 0 :(得分:10)

Python中的类似代码片段可能是:

def somename(z):
    i = 0
    while (....):
        a += z[i]
        b += z[i+1]
        c += z[i+2]
        i += 3

在C中,z有点像数组索引,除了它从数组起始地址开始,而不是从0开始。在Python中没有类似的概念,所以你需要明确使用列表索引。

(....)内的任何内容都需要修改。我会把它作为练习留给你,因为它在这个问题中没有说明。

答案 1 :(得分:1)

z += 3的含义基本上是将指针3元素向下推进。假设您有一个指向C中名为lst的数组的指针,其中包含[1, 2, 3, 4]。指针lst指向第一个元素,使*lst等同于lst[0]。此外,*(lst+1)相当于lst[1]

答案 2 :(得分:0)

假设z作为列表传递(在相应的python代码中)。 z += 3可以转换为del z[:3],将元素3移动到0。 但是在python中,你需要在执行之前复制数组,因为使用del语句,数组会被修改。

在C中,您可以通过负索引访问指向索引之前的元素。这可以通过嵌套在类中的“不可见”偏移来完成。访问列表时,始终将此偏移量添加到索引中。 以下类演示了该行为。

class pointer_like:
    def __init__(self, lst):
        self.lst = lst; self.offset = 0

    # self[index]
    def __getitem__(self, index):
        return self.lst[self.offset + index]

    # self += offset
    def __iadd__(self, offset):
        self.offset += offset

    # other member functions...

# as your example above
def somename(z):
    z = pointer_like(z)
    while (....):
        a += z[0]
        b += z[1]
        c += z[2]
        z += 3

>>> # other example
>>> z = pointer_like([0, 1, 2, 3, 4, 5])
>>> z[0]
0
>>> z += 3
>>> z[0]
3
>>>
>>> # with normal python lists, this would mean third last element
>>> z[-3]
0
>>> z += -5
>>> z[2]
0
>>>
>>> # this is special, because z.offset is negative (-2),
>>> # when a list item is accessed through a negative index,
>>> # it is counted from the end of the array in python.
>>> # In this case, it is -2, so the second last is accessed
>>> # In C this would cause undefined behavor, on most
>>> # platforms this causes an access violation
>>> z[0]
4

请注意,pyhon还有一个+=运算符用于列表,但这允许在末尾添加另一个列表。