кстати там ошибка - не определено возвращаемое значение в случае равенства lAdr нулю. К тому же одно из преобразований смысла не имеет, т.к. uint32* pAdr = (uint32*)lAdr; уже дает pAdr типа uint32*
и дальнейшее приведение pAdr к типу uint32* в строке (uint32*)(pAdr) смысла не имеет. Имхо правильнее написать так:
uint32 MemorySpy(uint32 lAdr)
{
if (lAdr)
{
return *((uint32*)(lAdr));
}
return 0;
}
Но и эта реализация таит засаду, связанную с невозможностью отличить ошибочную ситуацию (lAdr==0) от просто значения 0, хранящегося по адресу lAdr. К тому же для такого простого случая вызов функции обычно снижает эффективность, я в таких случаях использую макрос типа
#define GET_DWORD_FROM_ADR32(x) (*((uint32*)(x))
а проверку адреса на валидность делаю в случае необходимости самостоятельно
по второму примеру лень разбираться