Я использовал пример кода, который работает в процессоре ARM. Чтобы прочитать определенную ячейку памяти, она преобразует постоянное значение в адрес.
Например:
Мы хотим прочитать значение памяти в 0xa0000000
Пример кода выглядит так:
uint32_t test_data;
const uint32_t test_address = 0xa0000000;
test_data = *(uint32_t*) test_address;
Я не совсем понимаю актерский состав * (uint32_t *). Мне кажется, что достаточно одного *.
Буду признателен за объяснение.
Благодарю.
Вы храните указатель как uint32_t вместо указателя на uint32_t. Вот почему вы должны сделать дополнительный актерский состав.
Я бы порекомендовал следующее:
#include <iostream>
int main(int argc, const char** argv) {
volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
uint32_t value = *test_address;
return 0;
}
В ролях (uint32_t*) test_address
переосмысливает значение test_address
как адрес, и выдает указатель, указывающий на этот адрес. Этот С-бросок имеет тот же эффект, что и reinterpret_cast
будет — и действительно, reinterpret_cast
следует использовать вместо
Чтобы получить значение, на которое указывает указатель, то есть его указатель, необходимо разыменовать его через *
, Это дает нам * ((uint32_t*) test_address)
или эквивалентно *(uint32_t*) test_address
,
понятнее, если разделить
test_data = *(uint32_t*) test_address;
в два этапа
uint32_t *p = (uint32_t*) test_address;
test_data = *p;
Первый актерский состав, второй — разыменование