Что действительно делает добавление int к указателю uint8_t? - PullRequest
0 голосов
/ 21 апреля 2020

Я не кодирую в C много, но в настоящее время я (пытаюсь) перенести проект C на Rust, и я не понимаю, что это делает:

void example(const uint8_t *m, unsigned int r)
{
    m += r;
}

После небольшого поиска в Google, я думаю , что он такой же, как m = m[r]. Но если это так, m и m[r] - это два разных типа данных (верно ...?). Попытка повторить это в Rust:

fn example(m: &mut [u8], r: u32) {
    m = m[r];
}

Это дает ошибку mismatched types: expected `&mut [u8]`, found `u8, что имеет смысл. Я либо ошибся в части Rust, либо не до конца понял, что делает часть C. Может кто-нибудь объяснить, где я ошибся?

1 Ответ

2 голосов
/ 21 апреля 2020

Учитывая указатель m на некоторый элемент в массиве, скажем x, и целое число r, m += r корректирует m, чтобы указывать на элемент, который является r элементами после x .

Например, если m указывает на a[3], а r равно 5, то m += r меняет m на a[8].

В случае где m - это uint8_t *, оно должно указывать на элементы, которые являются байтами, а продвижение m на r элементов продвигает указатель на r байтов. В случаях, когда m указывает на больший тип, например, когда m равен int *, продвижение m на r элементов продвигает указатель на r*s байтов, где s - количество байтов в каждом элементе.

Во многих реализациях C байты в памяти просто нумеруются последовательно, начиная с 0 (хотя не все байты могут быть отображены в виртуальном адресном пространстве), и указатель представлен номером байта, на который он указывает. В этом случае, чтобы увеличить указатель на n байтов, реализация C просто добавляет n к своему представлению. В реализациях C с более сложными моделями памяти реализация C выполняет любые манипуляции, необходимые для создания указателя на нужное место.

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