Оперативная память машины логически является большим одномерным массивом байт.
Указатель - это адрес (порядковый номер) байта в памяти. Бывают более сложные модели адресации, но они в основном вышли из употребления. Разве что столкнёшься с MS-DOS.
Если тип данных занимает больше одного байта, то указатель на этот тип - это адрес его первого по порядку байта.
Ссылка - это замаскированный указатель. Если для получения значения по указателю применяется операция разыменования (например, *p или p->field), то со ссылкой можно обращаться, как с самим значением. Страуструп ввёл эту штуку в язык, чтобы можно было переопределять операции (a + b выглядит более естественно, чем *a + *b), но поскольку механизм ссылок (как и всё в C++) проектировался на коленке, без должного продумывания всех аспектов, то получилась синтаксическая каша, которую уже 40 лет пытаются привести в порядок, всё усложняя и усложняя стандарт, и до сих пор эта цель не достигнута.