Разница между конст.указатель и ссылка? - PullRequest
38 голосов
/ 25 февраля 2010

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

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

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

ура

Ответы [ 5 ]

50 голосов
/ 25 февраля 2010

Существует 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 выше наиболее похож на ссылку.

Существуют ключевые различия между ссылками и всеми тремя указателями констант выше:

7 голосов
/ 25 февраля 2010

Я предполагаю, что вы имеете в виду константный указатель (например, int * const ptr), а не указатель на const (например, int const * ptr).

  • Не инициализация ссылки является компиляциейошибка (устраняет проблему неинициализированных указателей)
  • Указатель также может указывать на массив или может быть НЕДЕЙСТВИТЕЛЕН, где ссылка всегда ссылается только на один объект.
  • Синтаксис оченьразные
6 голосов
/ 25 февраля 2010

Когда вы должны использовать каждый:

ссылка : Используйте их по умолчанию. Люди часто разыменовывают NULL-указатели. Вы устраняете этот риск с помощью ссылки.

константный указатель : Когда вы хотите ссылку, но не можете ее сделать. Например, вы пишете драйвер, и вам нужен указатель на начало карты памяти. Ссылка не имеет большого смысла в этом случае. Также, если вам нужен массив вещей, ссылка не будет работать (хотя массив простых классов со ссылочными членами будет работать).

В следующем примере константный указатель проверяет ошибку, которую не может проверить ссылка:

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 );
}
3 голосов
/ 23 октября 2017

Почти все пункты были охвачены другими ответами, кроме этого важного: Можно делать арифметику по указателям, но не по ссылке. Э.Г.

int a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1);  // sets c = 18
0 голосов
/ 25 февраля 2010

Некоторые отличия:

Константный указатель может указывать на NULL.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...