Передача путаницы?

Рассмотрим этот пример:

void MyFunction(int &x){...}

void MyOtherFunction(int *x){...}

int main()
{
int my_variable = 10;
MyFunction(my_variable);
MyOtherFunction(&my_variable);
}

Правильно ли я сказал, что оба эти метода передают переменную по ссылке (т.е. не создают копию), и единственное отличие состоит в том, что MyOtherFunction получает указатель?

2

Решение

Вы правы, когда говорите, что не копируете my_variable, но указатель это не ссылка, это два набора разных типов.

Например, указатель может быть нулевым, и вы можете вызвать MyOtherFunction(nullptr),

4

Другие решения

Да, нет копии. Передача указателя означает, что вы можете передать нулевой ptr, а при использовании ссылки вы должны передать действительный объект.

Для int, float и простых переменных передача по значению не дороже, при условии, что вам не нужно изменять внутри функции переданный параметр.

1

В своих примерах вы никогда не копируете my_variable (хотя вы копируете указатель при вызове void MyOtherFunction(int *x){...}, но это нормально).

Важное различие между этими двумя функциями заключается в том, что MyFunction(int &x) является правильной ссылкой на C ++ и никогда не будет нулевым (в обычном коде), тогда как вы можете передать nullptr MyOtherFunction(int *x), и это должно быть проверено во время выполнения. Версия указателя также может быть переназначена внутри MyOtherFunction как требуется.

1

Вы правы. В обоих вызовах вы передаете переменную по ссылке. Однако этот термин по ссылке в C ++ отличается от того же термина в C.

В Си, когда кто-то говорит, что передал аргумент по ссылке, это означает, что он передал указатель на переменную.

В C ++ ссылки имеют новое значение. Они являются частью спецификации языка. Поэтому, когда кто-то говорит, что передал аргумент по ссылке, обычно это означает, что соответствующий параметр объявлен как ссылка. 🙂

1

Передача по ссылке является псевдонимом orignal object, Передача по указателю создает дополнительную переменную для хранения адреса original object,

1
По вопросам рекламы [email protected]