Приведение константы для использования в качестве указателя

Я использовал пример кода, который работает в процессоре ARM. Чтобы прочитать определенную ячейку памяти, она преобразует постоянное значение в адрес.

Например:

Мы хотим прочитать значение памяти в 0xa0000000

Пример кода выглядит так:

uint32_t test_data;

const uint32_t test_address = 0xa0000000;

test_data = *(uint32_t*) test_address;

Я не совсем понимаю актерский состав *(uint32_t*). Мне кажется, что достаточно одного *.

Буду признателен за объяснение.

Благодарю.

3 ответа

Вы храните указатель как 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;

Первый актерский состав, второй - разыменование

Другие вопросы по тегам