Ссылка передается как (значение адреса), то есть на временном стеке функции не создается переменной с значением равным ссылке.
Грубо говоря ты работаешь напрямую с объектом оригиналом , на который указывает передаваемая ссылка.
Указатель создает на стеке переменную , значение которой равняется значению ссылки.
При этом объект оригинал может быть удален, а указатель в функции останется (на время жизни функции, пока не выйдете из функции).
Наверное как-то так... На самом деле надо смотреть ассемблерный код и разбираться на ассемблере, а это уже совсем не просто.
передача ссылки в функцию
void ref(int &r)
{
//r=0x34; // здесь можно присвоить новое значение
int *y=&r; // здесь создаем новый указатель
printf(" y=%x %p \n",y,y);
printf(" &y=%x %p \n",&y,&y);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int i=0x12;
int &ri=i;
int *pi=&i;
printf(" i=%x \n",i);
printf(" pi=%x %p \n",pi,pi);
printf("*pi=%x %p \n",*pi,*pi);
printf(" ri=%x %p \n",ri,ri);
ref(i);
int y=9;
ref(i);
вывод:
i=12
pi=28ff18 0028FF18
*pi=12 00000012
ri=12 00000012
y=28ff18 0028FF18
&y=28feec 0028FEEC
y=28ff18 0028FF18
&y=28feec 0028FEEC
// видно , что функция ref подчищает за собой память, указатели не плодятся в памяти.
передача указателя в функцию
Сделать новый указатель можно через только оператор & (оператор new не считаем) :
int *y=π
void point(int *i)
{
printf(" ----- point -----\n");
int *pi=i; // так можно создать новый указатель
int **lpi=&i; // так тоже можно создать новый указатель
printf(" i=%x %p \n",pi,pi);
printf(" *i=%x %p \n",*pi,*pi);
printf("&i=%x %p \n",&pi,&pi);
// новый указатель (созданный внутри функции)
// автоматически удаляется при выходе из функции
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int i=0x12;
int &ri=i;
int *pi=&i;
printf(" i=%x \n",i);
printf(" pi=%x %p \n",pi,pi);
printf("*pi=%x %p \n",*pi,*pi);
printf(" ri=%x %p \n",ri,ri);
point(pi); // можно так передать указатель
int y=9;
point(&i); // можно этак
вывод:
i=12
pi=28ff18 0028FF18
*pi=12 00000012
ri=12 00000012
----- point -----
i=28ff18 0028FF18
*i=12 00000012
&i=28fee8 0028FEE8
----- point -----
i=28ff18 0028FF18
*i=12 00000012
&i=28fee8 0028FEE8
// видно , что функция point подчищает за собой память, указатели не плодятся в памяти.