Возврат ссылочной переменной C ПРОТИВ возврата переменной

#c

#c

Вопрос:

Предположим, что в C используется следующая функция:

 #include <iostream>

intamp; change(intamp; a){
   a = 6;
   return a;
}

int main(){
   int a = 5;
   int b = change(a);
   std::cout << b << std::endl;
   return 0;
}
  

Выполнение этого вернет:

 6
  

Мой вопрос в том, что если я изменю возвращаемый тип с intamp; на int , компилятор не будет жаловаться, и он все равно будет печатать 6. Итак, как перенастройка ссылки работает в C ? (сравнивая его с возвратом указателя в C)

Комментарии:

1. b не является ссылкой, поэтому не имеет значения, change() возвращает ссылку или нет, b будет создана копия всего, что change() возвращается.

2. «как выполняется перенастройка ссылочной работы» — слишком широкий вопрос.

Ответ №1:

Ссылка, как и указатель, реализуется путем сохранения адреса объекта.

Возврат по значению означает, что он возвращает копию старого объекта.

Возврат по ссылке означает, что он возвращает адрес старого объекта.

 #include <iostream>

intamp; change_ref(intamp; a) {
    a = 6;
    return a;
}

int change_value(intamp; a) {
    a = 6;
    return a;
}

int main() {
    int a = 5;
    change_ref(a) = 7;
    // change_value(a) = 7; compile error
    std::cout << a << std::endl;

    intamp; a1 = change_ref(a); // return reference of a
    // now a1 ref the a
    a1 = 10;
    // print a = 10 and a1 = 10
    std::cout << a << " " << a1 << std::endl;

    int a2 = change_value(a); // return a value of a, so return is 6
    // value of a is 6 and define a new value a2
    a2 = 11;
    // set a2 to 11 and not change a
    // print a = 6, a1=6, a2= 11
    std::cout << a << " " << a1 << " " << a2 << std::endl;
    return 0;
}
  

Ответ №2:

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

Ответ №3:

Вы вызываете функцию change() по ссылке, а затем обновляете фактическое значение a до 6. Поскольку значение a обновлено до 6, то независимо от типа возвращаемого a значения будет содержать обновленное значение и всегда выводиться 6 в данном примере.

ПРИМЕЧАНИЕ: объявленные данные b is int , следовательно, вы не печатаете никаких ссылок.

Комментарии:

1. значит, печать ссылки не похожа на печать указателя? это не одно и то же?

2. @Joe нет, технически это не одно и то же (хотя ссылка может быть реализована с использованием указателя под капотом)

3. @Joe: объявленные данные b is int , следовательно, вы не печатаете ссылку.

4. изменение ее на std::cout << change(a) << std::endl; still выводит 6