Допустим, у меня есть функция, которая принимает целочисленное значение. Теперь в функции я хочу знать значение, которое хранится в ячейке памяти, на которую указывает это целочисленное значение.
void function(int a)
{
//say, a=10 then I want to know the value stored in memory address 10
}
int
не является подходящим типом для надежной передачи указателей на любую систему без риска возникновения неопределенного поведения.
Начиная с C99/С++ 11 вы можете использовать тип uintptr_t
, который может быть преобразован в указатель и от него:
// In C++ include <cstdint>
#include <stdint.h>
void function(uintptr_t a) {
uint8_t *ptr = (uint8_t*)a;
uint8_t val = *ptr;
}
В C++:
int function(int a)
{
return *reinterpret_cast<int*>(a);
}
Или в C (также работает в C++):
int function(int a)
{
return *(int*)a;
}
Конечно, это будет работать, только если адрес действительно вписывается в int
в первую очередь; на 64-битных системах, где int
имеет ширину 32 бита, на самом деле это не имеет смысла. uintptr_t
вы можете использовать uintptr_t
в качестве типа аргумента, так как это гарантировано достаточно, чтобы удерживать адрес (то есть указатель).
И я решил интерпретировать местоположение памяти как int
, но вам нужно использовать соответствующий тип возвращаемого значения (например, если адрес находится в конце страницы и вы разыскиваете 4-байтовый int, ваша программа может сбой).
Вы можете использовать int, чтобы передать подобное
#include<iostream>
using std::cout;
int main(int a)
{
int* test;
test = &a;
cout<<"Value of a is "<<*test<<"\n";
cout <<test<<" is the memory address of a\n";
}
Это оно :)