我正在尝试将一个简单的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中实现这一点。
答案 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还有一个+=
运算符用于列表,但这允许在末尾添加另一个列表。