Разница между константой. указатель и ссылку?
В чем разница между константным указателем и ссылкой?
Указатель константы, как следует из названия, не может быть связан снова. То же самое происходит с ссылкой.
Интересно, в каких сценариях можно было бы предпочесть друг друга. Насколько отличаются их стандарт С++ и их реализация?
веселит
Ответы
Ответ 1
Существует 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 выше наиболее похож на ссылку.
Существуют ключевые различия между ссылками и всеми тремя типами указателей констант выше:
Ответ 2
Я предполагаю, что вы имеете в виду const-значный указатель (например, int * const ptr), а не указатель на const (например, int const * ptr).
- Не инициализация ссылки - это ошибка компиляции (исключает проблему неинициализированных указателей)
- Указатель также может указывать на массив, или он может быть NULL, где ссылка всегда относится к одному объекту.
- Синтаксис очень отличается
Ответ 3
Когда вы будете использовать каждый из них:
ссылка:
Используйте их по умолчанию. Очень часто люди разыскивают указатели NULL. Вы устраняете этот риск со ссылкой.
указатель const:
Когда вы хотите ссылку, но не можете ее создать. Например, вы пишете драйвер, и вам нужен указатель на начало карты памяти. В этом случае ссылка не имеет особого смысла. Кроме того, если вам нужен массив вещей, ссылка не будет работать (хотя массив простых классов со ссылочными элементами будет).
В следующем примере указатель 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 );
}
Ответ 4
Почти все вопросы были затронуты другими ответами, кроме этого важного:
Можно делать арифметику по указателям, но не по ссылке.
Например.
int a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1); // sets c = 18
Ответ 5
Некоторые отличия:
Указатель const может указывать на NULL.
Константная точка может указывать на массив объектов.
Указатель константы может быть связан снова, отбросив константу.