Причина, по которой передается ссылка на функцию в C ++? - PullRequest
0 голосов
/ 29 сентября 2018

Здесь я пишу код на C ++.

int main()
{ 
  int setAcapacity = 10;
  int setANOE = 0;
  int *setA;
  createSet(&setA, setAcapacity);
}

void createSet(int **set, int n)
{
*set = new int[n];

}

Может кто-нибудь объяснить, пожалуйста, причину перехода по ссылке на функции createSet .. Спасибо заранее !!

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Что вы делаете в int createSet(int **set, int n), вы передаете указатель на указатель;не ссылка на указатель.Чтобы передать ссылку: int createSet(int * & set, int n).

В случае передачи по ссылке ваш код будет выглядеть следующим образом:

void createSet(int * & set, int n) // '&' for reference
{
    set = new int[n];
}

int main()
{
    int setAcapacity = 10;
    int setANOE = 0;
    int *setA = nullptr; // Better to initialize
    createSet(setA, setAcapacity);
}

На ваш вопрос: Разница между передачей по ссылкеУказатель / ссылка и передача по значению заключается в том, что изменения, внесенные в аргументы, передаваемые указателем / ссылкой в ​​вызываемую функцию, действуют в вызывающей функции, тогда как изменения, вносимые в аргументы, передаваемые по значению в вызываемой функции, не могут влиять на вызывающийфункция.# Значение # в вашем случае: # int-указатель #.

Вы передаете указатель / ссылку на # значение #, потому что вы хотите, чтобы присвоение цели setA вызывающей функции: main (),Вот почему вы также передаете в исходном коде адрес setA.Таким образом, new может хранить новый указатель в этом адресе.

Кроме того, во многих случаях: передача по ссылкам более эффективна, чем передача по значению, поскольку она не копирует аргументы.Формальный параметр - это псевдоним для аргумента.Когда вызываемая функция читает или записывает формальный параметр, она фактически читает или записывает сам аргумент.

0 голосов
/ 29 сентября 2018

Сначала вы не проходите по ссылке, вы передаете по указателю!

По ссылке выглядело бы так:

int createSet(int*& set, int n)
//                ^ reference to pointer
{
    set = new int[n]; // assign to referenced value
}

createSet(setA, setAcapacity);
//        ^ no need to take address

Есть две причины, по которым вы хотели бы пройти мимоссылка или указатель:

  1. Размер передаваемого объекта велик, копирование будет неэффективным.В этих случаях вы обычно передаете const ссылку или указатель на const.
  2. Переданный объект должен быть изменен внутри функции.Это случай в вашем примере, где новое значение назначено указателю setA вне функции, которая передается через указатель с именем set.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...