Алексей, расходы на локальную память растут: %1-%4. В локальной памяти хранятся результаты вызовов функций, а указатели не нужны, потому что указатели и есть адреса ячеек %1-%4.
*(&%1) превращается просто в упоминание %1.
Кстати, а как дела с указателями?
int i;
int main ()
{
int* p = &i;
(*p) = 42;
printf("%d", *p);
return 0;
}
Хороший компилятор соптимизирует до printf("%d", i), что не повысит статус указателя до магического, а просто в очередной раз подтвердит высокий уровень оптимизации.
NULL не может быть объектом по определению. NULL - это нулевой указатель и ничего более. Такой указатель не может указывать на объект (явно огворено в стандарте). Даже в экзотических архитектурах, где объекты могут быть размещены по нулевому (0x0000 в терминах железки) адресу, указатель на такой объект (this) не будет равен NULL (потому что NULL будет представлен там каким-то другим значением).
Имеется в виду распространённая практика null с малой буквы, то есть реальный объект, играющий роль пустышки.
TObject null_obj;
TObject* null = &null_obj;