В чем принципиальное отличие ссылки от указателя в С++? Когда лучше использовать ссылку, а когда указатель? Какие ограничения есть у первых, а какие у вторых?
Ответ Еще отличия: Нельзя объявить массив ссылок. У ссылки нет адреса. Существует арифметика указателей, но нет арифметики ссылок. Указатель может иметь «невалидное» значение с которым его можно сравнить перед использованием. Если вызывающая сторона не может не передать ссылку, то указатель может иметь специальное значение nullptr: void f(int* num, int& num2) { if(num != nullptr) // if nullptr ignored algorithm { } // can't check num2 on need to use or not } http://rextester.com/EQMC52074 (Standart) A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type. Ссылка не обладает квалификатором const #include int main() { std::cout << "Hello, world!<br>" const int v = 10 //int& const r = v // Ошибка const int& r = v enum { is_const = std::is_const::value } if(!is_const) std::cout << "const int& r is not const<br>" else std::cout << "const int& r is const<br>" }
О весёлом Некоторые ссылаются на отрывок с интервью с Страуструпом: Очевидной реализацией ссылки является (константный) указатель, при каждом использовании которого происходит разыменование. В некоторых случаях компилятор может оптимизировать ссылку таким образом, что во время исполнения вообще не будет существовать объекта, представляющего ссылку. Другие задают в ответ лишь в один вопрос: Чем является реультат разыменовывания указателя? На тему, нужно ли знать отличия указателя от ссылки, писал Джоэл Спольски в своей статье «Закон Дырявых Абстракций».