Как я могу перевести его в адрес памяти?
Номер уже представляет собой адрес памяти, не требуется никаких переводов.
Как я могу использовать этот адрес & изменить значение?
На арене встроенных систем мы берем указатели и назначаем их указателям. Если мы хотим получить доступ к 16-разрядным регистрам или адресу памяти, мы должны назначить указатель uint16_t
на значение.
uint16_t * memory_pointer = (uint16_t *) 0x40000000;
Можно печатать все адреса памяти, что процесс использует?
Это проблема с операционной системой. Некоторые операционные системы пытаются в значительной степени предотвратить доступ одной программы к области памяти другого процесса. «Другой процесс» может быть заменен на диск при запуске вашего процесса и использовать ту же область памяти, что и ваш процесс. Так что это возможно или не зависит от операционной системы вашей платформы.
Возможно получить значение, указанное адресом?
В зависимости от операционной системы и платформы. Некоторые платформы имеют память на определенных адресах, и доступ к адресу за пределами этого диапазона приводит к неопределенным поведением.
Некоторые операционные системы защищают доступ к памяти вне вашего процесса (например, память ядра). Результаты доступа к памяти в этом случае зависят от операционной системы.
Метод доступа к памяти заключается в разыменовании указателя. В C++ для доступа к байтам вы должны использовать указатель на uint8_t
.
«Теперь я знаю, что адрес памяти работает с шестнадцатеричным, а не десятичным» - это не так, и это едва ли имеет смысл. – immibis
База, используемая для представления числа, не имеет значения для значения этого номера. 0x10 16 и двоичные 10000 - одинаковые значения. –
это уже адрес памяти, но обозначение «0x400000». для изменения этого адреса вы не можете его постоять, как вы пишете: '5 ++'. для печати значения внутри него вы используете оператор разыменования '*': 'cout << * ptrToAddr;' – Raindrop7