Мне не ясно, является ли ваш вопрос ptr-to-obj против obj на основе стека или ptr-to-obj по сравнению со ссылкой на obj. Есть также применения, которые не попадают ни в одну из категорий.
Что касается стека, который, кажется, уже описан выше. Несколько причин, наиболее очевидными из которых является время жизни объекта.
Что касается ссылок, всегда старайтесь использовать ссылки, но есть вещи, которые вы можете делать только с ptrs, например (есть много вариантов использования):
- обход элементов в массиве (например, переход по стандартному массиву [])
- когда вызываемая функция выделяет что-то и возвращает это через ptr
Самое главное, что указатели (и ссылки, в отличие от автоматических / основанных на стеке и статических объектов) поддерживают полиморфизм. Указатель на базовый класс может фактически указывать на производный класс. Это фундаментально для поведения ОО, поддерживаемого в C ++.