Указатели и ссылки - чем отличаются в чем разница

Ссылка (reference) — это псевдоним существующей переменной, который не может быть пустым и не меняется после инициализации
а вот указатель указатель (pointer) — это самостоятельная переменная, хранящая адрес памяти, которую можно переназначать, делать нулевой (nullptr) или использовать для адресной арифметики.

Дополнительно

Ссылка - это псевдоним - альтернативное имя для объекта.
Так например можно передавать объект в функцию по ссылке:

 void swap(int& i, int& j)
 {
   int tmp = i;
   i = j;
   j = tmp;
 }
 
 int main()
 {
   int x, y;
   ...
   swap(x,y);
   ...
 } 

Указатель - это переменная представляющая собой адрес в памяти другой переменной.

То есть указатель предоставляет возможность работать с памятью - над ним можно выполнять арифметические операции и таким образом выбирать другие области памяти (это, правда, зависит от языка, напр. в golang такой арифметики нет, но адрес всё равно хранится в указателе, который не является ссылкой)

Пара примечаний:
То есть у указателя главный "бонус" (в сравнении с сылкой)- возможность работать с памятью
ссылку в каком-то смысле можно трактовать как разыменованный константый указатель - действительно - "в общем случае" - с точки зрения проведения возможных операций ссылка предоставляет их множество, которое заключено во множестве операций, которые можно выполнить, если вместо неё передан указатель на объект .

_____________________________________________
Источники(читать подробнее)=
http://www.parashift.com/c%2B%2B-faq-lite/references.html
и довольно мутно здесь = - http://forum.ixbt.com/topic.cgi?id=40:680
Ключевые слова и фразы(для поиска)=