Для большей ясности используйте объявление псевдонима вместо определения typedef.
struct prog1
{
int a,b;
};
using obj = struct prog1 *;
Таким образом, имя obj
является псевдонимом для типа struct prog1 *
. obj
не является переменной.
Таким образом, в этом объявлении
obj1 moc;
определена переменная moc
с типом obj
. Это объявление эквивалентно следующему объявлению
prog1 *moc;
То есть там объявлен указатель типа prog1 *
.
Обратите внимание, что указатель не инициализирован. Так что это имеет неопределенное значение. В результате следующий оператор
moc->a=10;
вызывает неопределенное поведение.