передача указателей и ссылок в функцию (int)

Ссылка передается как (значение адреса), то есть на временном стеке функции не создается переменной с значением равным ссылке.

Грубо говоря ты работаешь напрямую с объектом оригиналом , на который указывает передаваемая ссылка.

Указатель создает на стеке переменную , значение которой равняется значению ссылки.

При этом объект оригинал может быть удален, а указатель в функции останется (на время жизни функции, пока не выйдете из функции).

Наверное как-то так... На самом деле надо смотреть ассемблерный код и разбираться на ассемблере, а это уже совсем не просто.

передача ссылки в функцию

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 подчищает за собой память, указатели не плодятся в памяти.