Где и почему мы используем «указатели, которые указывают на константы», «постоянные указатели» и «постоянные указатели, которые указывают на константы»?

0

поэтому, если у меня есть что-то подобное в C++:

char A_char = 'A';
char * myPtr = &A_char;

const char * myPtr = &char_A; //pointers that point to constants
char * const myPtr = &char_A; //constant pointers
const char * const myPtr = &char_A; //constant pointers that point to constants

Мне было интересно, где и почему мы используем "указатели, указывающие на константы", "постоянные указатели" и "постоянные указатели, указывающие на константы" в программировании. Я знаю различия между ними и их синтаксисом, но я понятия не имею, где и почему мы их используем. Вы могли бы объяснить? Спасибо, парни.

  • 0
    Возможный дубликат того, в чем разница между const int *, const int * const, int const *
  • 0
    Очень похоже, но один из них "Кто они?" другой - «Когда мы их используем?»
Показать ещё 3 комментария
Теги:
pointers
const
constants

3 ответа

0
Лучший ответ

Поскольку вы запрашиваете примеры использования:

  • Типичное использование для указателя на постоянный символ - это перемещение указателей в постоянную память (например, строковые литералы). Эта память может быть разыменована, но не изменена (неопределенное поведение)

    const char* myPtr = "this is read only memory";
    
  • Постоянный указатель на символ может использоваться для перемещения вокруг местоположения буфера, который может быть изменен, но местоположение не может быть изменено (т.е. Вам нужно специально использовать эту область памяти)

    char * const myPtr = some_buffer_location;
    printBuffer(myPtr);
    
    void copyToBuffer(char * const &pointer_to_buffer /* Reference to pointer */) {
        const char* my_contents = "this is my content";
        strcpy(pointer_to_buffer, my_contents); // Buffer contents can be changed
        // pointer_to_buffer = NULL; - error! Not assignable
    }
    
  • Комбинацию вышеизложенного можно использовать для передачи области памяти только для чтения и обеспечения того, что указанный адрес остается неизменным, а его содержимое остается неизменным.

Достижение полной const-correctness чрезвычайно тяжело, но если кто-то желает преследовать эту цель, необходима правильная комбинация вышеуказанных флагов.

1

Постоянный указатель - это указатель, который не может изменить адрес, который он удерживает.

<type of pointer> * const <name of pointer>

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

const <type of pointer>* <name of pointer>

Постоянным указателем на константу является указатель, который не может ни изменить адрес, на который он указывает, ни изменить значение, сохраненное на этом адресе.

const <type of pointer>* const <name of pointer>

Вы можете найти более подробную информацию об их использовании здесь: http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967/Constant-Pointers-and-Pointers-to-Constants.htm

0

Если данные не должны меняться:
Используйте указатель на постоянные данные.
const char * myPtr = &char_A;

Если данные могут измениться, но указанная память не должна:
Используйте постоянный указатель:
char * const myPtr = &char_A;

Если данные не должны меняться, а указанная память не должна изменяться:
Используйте постоянный указатель на постоянные данные:
const char * const myPtr = &char_A;

На самом деле это не так уж и много.

  • 0
    Я действительно не понимаю, отрицательный голос ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню