Решил раз и навсегда окончательно разобраться в этом базовом вопросе.
Нашел хорошие статьи об этом.
Например, вот тут все хочень хорошо изложено
https://teccxx.neocities.org/mx1/pointers.htmlТем не менее, остались вопросы, на которые я надеюсь получить ответ тут.
В примерах ниже, прошу преставить вместо
"int", например, очень большой текст.
1. Использование ссылок при передаче переменных в функциюКод:
int a = 10;
int GetValue1(const int &var){
return var;
}
int b = GetValue1(a);
Если я все правильно понимаю, то в данном случае, при подставлении переменной
"a" в функцию
"GetValue1", фактически внутри функции используется ссылка на переменную
"a".
Вопрос в том, что именно передается в функцию? Большая пребольшая переменная или ее адрес?
Что функция возвращает? Большую переменную или адрес какого-то участка памяти, из которого потом все копируется в
"b".
Чтобы понять вопрос, рассмотрим следующий пример.
Если я хочу получить указатель на данную переменную, чтобы не занимать память, то
Код:
int* c = &GetValue1(a);
Т.е. я получаю переменную из функции (или ее адрес?) и дальше беру адрес этой переменной (или адрес адреса?)?
Мне важно понять, будет ли функция
"GetValue1" в данном случае "перекачивать" куда-то данные из
"a"?
2. Использование указателей как результат работы функции.Продолжаем дописывать предыдущий пример.
Код:
int* GetValue2(const int &var){
return &var;
}
int* d = GetValue2(a)
В данном случае, в строке
Код:
return &var;
мы получаем адрес переменной
"a" и передаем его дальше в качестве указателя.
Таким образом, переменной
"d" фактически присваиается адрес
"a", что нам и нужно. Т.е. большая переменная не передается, точно?
3. Использование указателей как результат работы функции и для передачи в функцию.Код:
int* GetValue3(int *var){
if (*var <= 0){
return nullptr;
}
return var;
}
int* e = GetValue3(&a)
В данном примере передается адрес переменной
"a" в виде указателя, который потом разименовывается для сравнения.
В итоге возвращается указатель на
"a", если
"a" больше ноля (для примера).
Насколько затрана операция разименования?
Итог:Пожалуйста ответье на вопросы по тексту выше, и желательно не просто ссылкой на очередной мануал для тех, кому мануалы уже не нужны.
Т.е. где все слишком заумно написано.
И еще вопросы:
Что будет работать быстрее и/или "ошибкоустойчивее"?
Код:
int b = GetValue1(a);
int* c = &GetValue1(a);
int* d = GetValue2(a)
int* e = GetValue3(&a)
Т.е. интересует какой из примеров окажется наиболее приемлимым с точки зрения затрат памяти и быстродействия.
Насколько дорого обойдется потом вот такая операция:
Код:
int f = *c;
Или, если разыменование указателя не избежать, то лучше сразу передавать переменную?
Заранее благодарен за ответы.