Подтвердить что ты не робот

Разве разыменование указателя делает его копию?

Разве разыменовывает указатель и передает его функции, которая принимает свой аргумент по ссылке, создает копию объекта?

4b9b3361

Ответ 1

В этом случае значение в указателе копируется (хотя это не обязательно так, как оптимизатор может его оптимизировать).

int val = *pPtr;

В этом случае, однако, копия не будет выполнена:

int& rVal = *pPtr;

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

То же самое, очевидно, относится к параметрам функции.

Ответ 2

В простом случае нет. Однако есть более сложные случаи:

void foo(float const& arg);
int * p = new int(7);
foo(*p);

Здесь создается временный объект, поскольку тип разыменованного указателя (int) не соответствует базовому типу параметра функции (float). Существует последовательность преобразования, и преобразованное временное может быть привязано к arg, поскольку это константная ссылка.

Ответ 3

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

Кроме того, что ожидаемое поведение ссылки:

void inc(int &i) { ++i; }

int main()
{
    int i = 0;
    int *j = &i;
    inc(*j);
    std::cout << i << std::endl;
}

Этот код должен печатать 1, потому что inc принимает свой аргумент по ссылке. Если бы была сделана копия по вызову inc, код напечатал бы 0.

Ответ 4

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