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

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

Например:

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

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

uint32_t test_data;

const uint32_t test_address = 0xa0000000;

test_data = *(uint32_t*) test_address;

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

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

Благодарю.

0

Решение

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

Другие решения

В ролях (uint32_t*) test_address переосмысливает значение test_address как адрес, и выдает указатель, указывающий на этот адрес. Этот С-бросок имеет тот же эффект, что и reinterpret_cast будет — и действительно, reinterpret_cast следует использовать вместо

Чтобы получить значение, на которое указывает указатель, то есть его указатель, необходимо разыменовать его через *, Это дает нам * ((uint32_t*) test_address)или эквивалентно *(uint32_t*) test_address,

1

понятнее, если разделить

test_data = *(uint32_t*) test_address;

в два этапа

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

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

0
По вопросам рекламы [email protected]