В чём будет разница при передаче в параметры функции переменной типа double при следующих вариантах записи:
(*my_double)
(&my_double)
(&*my_double)
И какой вариант предпочтительнее для быстродействия?
C/C++
Передача параметров функцию.
1. (*my_double) – это разыменование указателя на переменную типа double, то есть передача самого значения этой переменной.
2. (&my_double) – это передача адреса переменной типа double. Это нужно, если функция должна изменять значение переменной.
3. (&*my_double) – это не имеет смысла, так как &* обнуляет друг друга, поэтому это эквивалентно просто my_double.
Для быстродействия предпочтительнее использовать первый вариант – (*my_double), так как он не требует дополнительных операций по получению адреса переменной. Однако, если функция должна изменять значение переменной, необходимо передавать адрес этой переменной (&my_double).
2. (&my_double) – это передача адреса переменной типа double. Это нужно, если функция должна изменять значение переменной.
3. (&*my_double) – это не имеет смысла, так как &* обнуляет друг друга, поэтому это эквивалентно просто my_double.
Для быстродействия предпочтительнее использовать первый вариант – (*my_double), так как он не требует дополнительных операций по получению адреса переменной. Однако, если функция должна изменять значение переменной, необходимо передавать адрес этой переменной (&my_double).
Вячеслав Стрела
Как то так я и предполагал. Спасибо.
Нужно отделить описание функции и вызов функции, например
void _Myfunc1( int *a){ } // описывается функция, которая будет принимать указатель на целочисленную переменную
int b=10; _Myfunc1(&b); // вызывается функция в передачей параметра - адрес переменной (указатель на переменную )
void _Myfunc2( int a){ } // описывается функция, которая будет принимать значение целочисленной переменной
int b=10, *c=&b;_Myfunc2( *c); // вызывается функция, с передачей параметра со значением взятым по адресу c ( в которой хранится указатель на переменную b )
итд
В вопросе используется синтаксис вызова функции, а не описание, потому Михаил Кузменков ответил правильнее, чем Сергей Степанов
void _Myfunc1( int *a){ } // описывается функция, которая будет принимать указатель на целочисленную переменную
int b=10; _Myfunc1(&b); // вызывается функция в передачей параметра - адрес переменной (указатель на переменную )
void _Myfunc2( int a){ } // описывается функция, которая будет принимать значение целочисленной переменной
int b=10, *c=&b;_Myfunc2( *c); // вызывается функция, с передачей параметра со значением взятым по адресу c ( в которой хранится указатель на переменную b )
итд
В вопросе используется синтаксис вызова функции, а не описание, потому Михаил Кузменков ответил правильнее, чем Сергей Степанов
(*my_double) - передача по указателю (адресу). Применяется если нужно изменить передаваемое значение, или если передаваемая структура большого размера и копирование не желательно - передается ее адрес чтобы внутри функции получить к ней доступ.
(&my_double) - передача по ссылке (введено в С++). Работает примерно как передача по указателю, но при этом не требуется разыменовывание внутри функции. Переменная ведет себя как оригинал.
(*&my_double) а не &*, передача указателя по ссылке. Применяется если требуется изменить сам передаваемый указатель. Например при замене одного массива другим. Другой способ - передача указателя на указатель, но это приводит к путанице.
(&my_double) - передача по ссылке (введено в С++). Работает примерно как передача по указателю, но при этом не требуется разыменовывание внутри функции. Переменная ведет себя как оригинал.
(*&my_double) а не &*, передача указателя по ссылке. Применяется если требуется изменить сам передаваемый указатель. Например при замене одного массива другим. Другой способ - передача указателя на указатель, но это приводит к путанице.
Передача параметра по указателю: double *my_double
В этом случае в функцию будет передаваться адрес переменной типа double. Функция может получить доступ к значению переменной, используя оператор разыменования (*my_double).
Передача параметра по ссылке: double &my_double
В этом случае в функцию будет передаваться сама переменная типа double. Функция также может получить доступ к значению переменной, используя эту ссылку.
(&*my_double) является эквивалентом my_double, так как * оператор разыменования, а & - оператор взятия адреса.
В отношении быстродействия, передача параметров по ссылке обычно более эффективна, так как не требуется копировать значение переменной и работать с копией внутри функции. Однако, в случае передачи параметров по указателю может быть полезной возможность изменять значение переменной изнутри функции (если указатель передан как указатель на не-константный тип).
В целом, выбор между передачей параметров по ссылке и по указателю зависит от конкретной задачи, и от того, нужно ли изменять значение переменной внутри функции.
В этом случае в функцию будет передаваться адрес переменной типа double. Функция может получить доступ к значению переменной, используя оператор разыменования (*my_double).
Передача параметра по ссылке: double &my_double
В этом случае в функцию будет передаваться сама переменная типа double. Функция также может получить доступ к значению переменной, используя эту ссылку.
(&*my_double) является эквивалентом my_double, так как * оператор разыменования, а & - оператор взятия адреса.
В отношении быстродействия, передача параметров по ссылке обычно более эффективна, так как не требуется копировать значение переменной и работать с копией внутри функции. Однако, в случае передачи параметров по указателю может быть полезной возможность изменять значение переменной изнутри функции (если указатель передан как указатель на не-константный тип).
В целом, выбор между передачей параметров по ссылке и по указателю зависит от конкретной задачи, и от того, нужно ли изменять значение переменной внутри функции.
Похожие вопросы
- Передача параметров в функцию по адресу.
- Как отсортировать массив в зависимости от третьего параметра функции?
- Не понимаю как в параметрах функции учесть, например, только положительные числа, когда флоат и т. д. Тема перегрузка функций
- Почему при работе с небольшими объёмами данных передача параметров по адресу может быть эффективнее, чем по значению?
- Передача в метод класса указателя на функцию C++
- Передача строк в функцию С++
- Не могу разобраться. Функция удаления отрицательных элементов вектора
- Как в функции распечатать двумерный динамический массив в Си
- Как завершить условие в функции?
- Возвращение функции return func(); (Си)