C арифметика указателей в Python - PullRequest
4 голосов
/ 07 апреля 2011

Я пытаюсь преобразовать простую C-программу в Python, но, поскольку я ничего не знаю о C и немного о Python, мне просто сложно ..

Я застрял в указателях C.

Существует функция, которая принимает беззнаковый длинный int-указатель и добавляет его значения к некоторым переменным в цикле while:

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

Может кто-нибудь подсказать, как выполнить то же самое?вещь в питоне?(Часть, которую я совсем не понял, это "z + = 3")

Я знаю, что в python нет указателей.(по крайней мере, не так, как C) Но проблема в том, что я не знаю, что именно делают указатели C, и поэтому не может этого добиться в python.

Ответы [ 3 ]

10 голосов
/ 07 апреля 2011

Подобный фрагмент кода в Python может быть:

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

В C z работает как индекс массива, за исключением того, что он начинается с любого адреса начала массива, а не с нуля. В Python нет аналогичного понятия, поэтому вам нужно использовать индекс списка явно.

Все, что находится внутри (....) тоже нуждается в модификации. Я оставлю это как упражнение для вас, так как оно не указано в вопросе.

1 голос
/ 07 апреля 2011

Что означает z += 3 - это, в основном, продвижение указателя на 3 элемента вниз.Скажем, у вас есть указатель на массив в C с именем lst, который содержит [1, 2, 3, 4].Указатель lst указывает на первый элемент, так что *lst эквивалентен lst[0].Кроме того, *(lst+1) эквивалентно lst[1].

0 голосов
/ 04 апреля 2018

Предполагается, что 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 также имеет оператор += для списков, но это позволяет добавить еще один список в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...