Это может быть немного слишком много деталей, но, если быть точным, указатель - это переменная объекта, которая хранит адрес другого объекта и имеет сам объект: вы можете запросить адрес указателя, вы можете изменитьуказатель ...
Ссылки (смысл C ++, а не Java) не являются объектными переменными (в текущем стандарте я считаю, что в c ++ 0x есть некоторые изменения), а скорее псевдонимы к объектам.Вокруг этого есть несколько технических деталей, например, тот факт, что вы можете создавать массивы объектов, но вы не можете создавать массивы ссылок (ссылки не являются объектами).
Теперь, если вы пришли изФон Java, что вам действительно нужно помнить, это то, что (хотя и не совсем одинаковые) переменные Java и указатели C ++ - это схожие вещи: они содержат ключ для доступа к объекту где-то, но концепция ссылки на C ++ недоступна в Java.По этой причине вы не можете реализовать swap
операцию в Java, за исключением некоторых конкретных типов:
template <typename T>
void swap( T & lhs, T & rhs )
{
T tmp = lhs;
lhs = rhs;
rhs = tmp;
}
int main() {
int a = 1, b = 5;
swap( a, b ); // a == 5, b == 1 after this call in this context
}
Если вы помните об этом и понимаете, что в Java ссылки передаются по значению (aкопия ссылки передается в функцию), тогда вы сделали хороший шаг в понимании семантики вызова функций C ++.