Давай попробуем разобраться, что у тебя написано:
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 //освобождаешь занятую ячейку в памяти.
Я сам новичок, и то что я тут написал, это моё понимание, очень хотел бы чтобы меня поправили.