«вернуть» несколько значений с & оператором, но без указателя: как это работает? - PullRequest
0 голосов
/ 16 марта 2019

Извините, если это уже было задано, но я не смог найти похожий вопрос / пример в сети.

В настоящее время я посещаю лекции по C ++ в университете (так как я должен), у меня уже есть относительно хороший опыт работы с языком C из предыдущих лекций.

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

// main.c 

#include <stdio.h>

void foo(int *addr_val_var1, int *addr_val_var2);

int main()
{
  int var1, var2;

  foo(&var1, &var2);
  printf("Results: %d %d \n", var1, var2);
}

void foo(int *addr_val_var1, int *addr_val_var2)
{
  *addr_val_var1 = 5;
  *addr_val_var2 = 7;
}

Однако, мой профессор говорит, что нам нельзя использовать указатели, и это его решение:

// main.cpp 

#include <iostream>
using namespace std;

// forward declarations
void foo(int &var1, int &var2);

int main()
{
    int var1, var2;

    foo(var1, var2);
    cout << "Results: " << var1 << " " << var2 << endl;

}

void foo(int &var1, int &var2)
{
    var1 = 5;
    var2 = 7;
}

Как работает этот метод? Я уже пробовал то же самое в C, но там это не работает. Насколько я знаю, & -оператор (по крайней мере, в C) дает адрес переменной в качестве параметра, а затем (обычно) ожидает переменную-указатель для работы (= возврат по адресу) - но в C ++ это также как-то работает по-другому ?

Спасибо

EDIT

ОК, это также работает в C, но как? Я вообще не знал этот метод и не нашел ссылки?

1 Ответ

0 голосов
/ 16 марта 2019

Я считаю (поскольку я не программист на C ++), что

void foo(int &var1, int &var2)

означает, что переменные var1 и var2 являются "ссылками".Это синтаксический способ сказать, что переменные передаются по ссылке, а не по значению.В теле компилятор теперь использует ссылку как в var= 5;.Он отменяет ссылку на эту переменную и затем присваивает ей.

Конечно, на более низком уровне это будет реализовано как указатели.

...