Давай попробуем разобраться, что у тебя написано:
int a = 3; // объявляем переменную типа int
int *p = 0; // объявляем указатель
p = &a; // записываем в указатель адрес переменной а
А теперь я предлагаю тебе прописать вот такие простые строчки, чтобы посмотреть что у тебя там всё таки хранится:
cout << "Значение a=" << a << endl; //значение a
cout << "Адрес &a=" << &a << endl; //здесь адрес а
cout << "Значение p=" << p << endl; //здесь адрес а
В твоем примере удалять ничего не нужно, это даже вызовет ошибку при компиляции, так как оператор delete используется в том случае, если память выделяешь ты динамически, используя ключевое слово new.
в твоем случае
int a = 3 // ты в памяти выделил 4 байта;
int *p = ты выделил (4 или 8 байта, на хранения адреса a, в зависимости от того, какая у тебя система 32-х или 64-х разрядная.
если ты объявляешь
int *p = new int //ты в динамической памяти выделяешь размер для хранения int
delete p //освобождаешь занятую ячейку в памяти.
Я сам новичок, и то что я тут написал, это моё понимание, очень хотел бы чтобы меня поправили.