Передавать по ссылке vs pass by pointer?

Возможный дубликат:
Когда передавать по ссылке и когда передавать указатель в С++?

В чем разница между передачей по ссылке и передачей значения указателем?

Ответы

Ответ 1

Когда вы передаете параметр по ссылке, параметр внутри функции является псевдонимом переменной, которую вы передавали извне. Когда вы передаете переменную указателем, вы берете адрес переменной и передаете адрес в функцию. Основное отличие состоит в том, что вы можете передавать значения без адреса (например, числа) в функцию, которая принимает ссылку на const, в то время как вы не можете передавать значения без адреса в функцию, которая принимает указатели константы.

Обычно компилятор С++ реализует ссылку как скрытый указатель.

Вы можете изменить свою функцию на вариант указателя следующим образом:

void flip(int *i) // change the parameter to a pointer type
{
    cout << "          flip start "<<"i="<< *i<<"\n"; // replace i by *i
    *i = 2*(*i); // I'm not sure it the parenthesis is really needed here,
                 // but IMHO this is better readable
    cout << "          flip exit  "<<"i="<< *i<<"\n";
}

int main()
{
    int j =1;
    cout <<"main j="<<j<<endl;
    flip(&j); // take the address of j and pass this value
    // adjust all other references ...
}

Ответ 2

Для второй части вашего вопроса, вот код.

#include <iostream>
#include <cassert>

using namespace std;

void flip(int *i)
{
    cout << "          flip start "<<"i="<< i<<"\n";
    *i *= 2;
    cout << "          flip exit  "<<"i="<< i<<"\n";
}

int main()
{
    int j =1;
    cout <<"main j="<<j<<endl;
    flip(&j);
    cout <<"main j="<<j<<endl;
    flip(&j);
    cout <<"main j="<<j<<endl;
    flip(&j);
    cout <<"main j="<<j<<endl;

    assert(j==8);

    return 0;
}

В первой части вашего вопроса я новичок в С++, но считаю полезным передавать указатель при возвращении нескольких выходов для функции. Или передать NULL в качестве параметра.

Ответ 3

технически, вам просто нужно поставить звездочку перед тем, как имя переменной будет передаваться по ссылке;) теперь она передаст адрес, где ваша переменная находится в вашей памяти.

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

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

если вы пройдете по ссылке.. вы: эй, я тебе кое-что дам.. друг: что это? вы: это на правой стороне стола, где кувшин для печенья друг: спасибо xD

Если вы пройдете по значению, ваш друг не знает, откуда пришел конфета. это может произойти из магазина, холодильника или где угодно. теперь, если вы пройдете по ссылке, ваш друг не знает, что вы собираетесь ему дать.

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