Рассмотрите тривиальный тест этой функции свопинга в C++, который использует проход по указателю.Почему C не проходит по адресу/ссылке без указателей?
#include <iostream>
using std::cout;
using std::endl;
void swap_ints(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
return;
}
int main(void)
{
int a = 1;
int b = 0;
cout << "a = " << a << "\t" << "b = " << b << "\n\n";
swap_ints(&a, &b);
cout << "a = " << a << "\t" << "b = " << b << endl;
return 0;
}
Использует ли эта программа больше памяти, чем если бы я прошел по адресу? Такие, как в этой функции decleration:
void swap_ints(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
return;
}
это пройти по ссылке версия функции C++ использовать ли меньше памяти, при необходимости не создавать переменные-указатели?
И не имеет ли эта способность «пропуска по ссылке» то же, что и C++? Если да, то почему бы и нет, потому что это означает, что код с большей эффективностью памяти будет правильным? Если нет, то в чем заключается ошибка в том, что C не использует эту способность. Я полагаю, что я не рассматриваю тот факт, что C++, вероятно, создает указатели для достижения этой функциональности за кулисами. Это то, что на самом деле делает компилятор - и поэтому у C++ действительно нет никакого истинного преимущества помимо кода neater?
Ссылки ** являются ** указателями, они просто * выглядят * разными. Тем не менее, ничто не отличается от них. (За исключением того, что они не могут быть пустыми.) – Mehrdad
@Mehrdad Итак, мое предположение было правильным, нет никакой функции, кроме как сделать код более аккуратным. – Leonardo
Не просто аккуратный, но и безопасный, потому что ссылка не может быть NULL, как указатель. Но под капотом ссылки и указатели обычно производят один и тот же машинный код при компиляции. –