Каково различие между постоянным указателем и ссылкой?
Постоянный указатель как имя подразумевает, не может быть связан снова. То же имеет место со ссылкой.
Интересно в том, какие сценарии были бы один быть предпочтенными по другому. Как отличающийся действительно ли их C++ является стандартным и их реализации?
аплодисменты
Есть 3 типа константных указателей:
//Data that p points to cannot be changed from p
const char* p = szBuffer;
//p cannot point to something different.
char* const p = szBuffer;
//Both of the above restrictions apply on p
const char* const p = szBuffer;
Метод № 2 выше больше всего похож на ссылку.
Между ссылками и всеми тремя типами константных указателей, указанных выше, есть ключевые различия:
Константные указатели могут иметь значение NULL.
Ссылка не имеет собственного адреса, в отличие от указателя.
Адрес ссылки - это фактический адрес объекта.
Указатель имеет свой собственный адрес, и в качестве своего значения он содержит адрес значения, на которое он указывает.
См. мой ответ здесь, чтобы узнать больше о различиях между ссылками и указателями .
Я предполагаю, что вы имеете в виду константный указатель (например, int * const ptr), а не указатель на const (например, int const * ptr).
Некоторые различия:
Указатель const может указывать на NULL.
Константный указатель может указывать на массив объектов.
Константный указатель может быть связан снова путем отбрасывания константности.
Когда следует использовать каждый:
ссылка: Используйте их по умолчанию. Очень часто люди разыменовывают NULL-указатели. Вы устраняете этот риск с помощью ссылки.
const pointer: Когда вам нужна ссылка, но вы не можете ее создать. Например, вы пишете драйвер, и вам нужен указатель на начало карты памяти. В этом случае ссылка не имеет особого смысла. Также, если вам нужен массив вещей, ссылка не подойдет (хотя массив простых классов со ссылочными членами подойдет).
В следующем примере указатель const проверяет ошибку, которую не может проверить ссылка:
int addFour( int* register ){
if(isNull(arg)){
throw NullPointerException();
}
// some stuff
*register += 4;
return register;
}
// This could be any function that does pointer math.
bool isNull(const int* ptr){
return( NULL == ptr );
}