Позвольте мне попробовать, чтобы вы поняли легко. Когда вы объявляете какую-либо переменную в вашей программе на c ++, компилятор создает запись в таблице символов для этой переменной, а затем для нее выделяется соответствующее пространство в памяти.
В случае ссылочной переменной в таблице символов появится новая запись, которая имеет такое же хранилище ссылочной переменной, для нее не будет места, выделенной позже, это просто псевдоним, как вы можете ссылаться двумя именами (например, имя, никнейм).
Теперь давайте рассмотрим переменную указателя. Независимо от этого это указатель, но это переменная, поэтому он также будет иметь запись в таблице символов и место для нее будет выделено позже.
Таким образом, из приведенных выше утверждений вы можете легко найти разницу ниже между адресом (указателем) и ссылочной переменной.
1) Для ссылочной переменной не будет выделяться дополнительная память, но для переменной-указателя будет 4 или 8 байт, в зависимости от системы (32- или 64-разрядной операционной системы), для которой вы собираетесь скомпилировать и запустить код.
2) вы не можете потом ссылаться на ссылочную переменную как обычно, поэтому вы не можете изменить ссылку, но в случае переменной указателя она может содержать другой указатель.
То же самое применимо для передачи по ссылке и передачи по адресу. Надеюсь, это поможет вам лучше понять.
Попробуйте выполнить приведенный ниже код, и вы обнаружите, что адрес переменной и ссылочной переменной совпадают
int main()
{
int i = 10;
int& j = i;
printf(" address of i = %u address of j = %u", &i, &j);
return 0;
}