#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
isint
, следовательно, вы не печатаете ссылку.4. изменение ее на
std::cout << change(a) << std::endl;
still выводит 6