Подтвердить что ты не робот

Разница между константой. указатель и ссылку?

В чем разница между константным указателем и ссылкой?

Указатель константы, как следует из названия, не может быть связан снова. То же самое происходит с ссылкой.

Интересно, в каких сценариях можно было бы предпочесть друг друга. Насколько отличаются их стандарт С++ и их реализация?

веселит

4b9b3361

Ответ 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.

Константная точка может указывать на массив объектов.

Указатель константы может быть связан снова, отбросив константу.