Когда вы должны использовать каждый:
ссылка :
Используйте их по умолчанию. Люди часто разыменовывают 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 );
}