const и volatile указатели
Const и volatile изменение ключевых слов как указатели обрабатываются. Const ключевое слово указывает, что указатель нельзя изменить после инициализации; указатель защищен от изменения после этого.
volatile ключевое слово указывает, что значение, связанное с именем, которое следует за действиями, может быть изменено, за исключением тех, в приложении пользователя.Следовательно, volatile ключевое слово полезно для объявления объектов в общей памяти, возможен несколькими процессами или глобальным места для данных, которые используются для связи с процедурами службы прерывания.
Если параметр объявлен как volatileперезагрузить компилятора значение из памяти, каждый раз, когда она осуществляется доступ программой.Это значительно сокращает возможные оптимизации.Однако, если изменить состояние объекта может неожиданно единственным способом гарантировать прогнозируемую производительность программы.
Чтобы объявить объект указывать к указателю как Const OR volatileиспользуйте объявление формы:
const char *cpch;
volatile char *vpch;
Объявления значение указателя, т е фактического адреса, хранящиеся в указателе - как Const OR volatileиспользуйте объявление формы:
char * const pchc;
char * volatile pchv;
Язык C++ не допускает назначения, разрешитьTfи бы изменение объекта или указателя, объявленных как Const.Такие назначения удалитьTfи бы сведения, которые были объявлены или указатель объект с таким образом, нарушая назначение исходного объявления.Рассмотрим следующие объявления:
const char cch = 'A';
char ch = 'B';
Если описанные выше объявления объектов (2cchтипа const charи chтипа **char)**допустимы следующие объявления и инициализации.
const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;
Следующие объявления и инициализации ошибочны.
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
объявление pch2 объявляет указатель, через который постоянно объект может быть изменен и поэтому запрещены.объявление pch3 указывает, что pointer постоянным, а не объектом. объявление запрещенные для этой же причине pch2 объявление запрещены.
Следующие 8 назначений показано присвоение через указатель и изменить значения указателя для указанных выше объявления; для теперь предположим, что был подходят для инициализации pch1 via pch8.
*pch1 = 'A'; // Error: object declared const
pch1 = &ch; // OK: pointer not declared const
*pch2 = 'A'; // OK: normal pointer
pch2 = &ch; // OK: normal pointer
*pch3 = 'A'; // OK: object not declared const
pch3 = &ch; // Error: pointer declared const
*pch4 = 'A'; // Error: object declared const
pch4 = &ch; // Error: pointer declared const
Указатели, объявленные как volatileили смесь Const и volatile, повинуйтесь тем же правилам.
Указатели Const объекты часто используются в объявлении функции следующим образом:
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
Предыдущая объявляется функция, оператор strcpy_s, где 2 3 аргументов типа для указателя char.Поскольку аргументы передаются по ссылке, а не по значению, функция была бы может изменить оба strDestination и strSource If strSource не объявлен как Const.объявление strSource Вставить как Const это гарантирует вызывающего объекта strSource невозможно изменить вызываемой функции.
Примечание |
---|
Поскольку стандартное преобразование TypeName * В Const TypeName *он допустим для передачи аргумента типа char * В strcpy_s.Однако обратное не имеет значение true; неявного преобразования не существует для удаления Const атрибут из объекта или указателя. |
A Const указатель заданного типа могут быть присвоены к указателю того же типа.Однако указатель которого нет Const не может быть присвоено a Const указатель.Следующий Код демонстрирует правильные и неправильные присваивания:
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
В следующем образце показано, как объявить объект как const если имеется указатель на указатель на объект.
// const_pointer2.cpp
struct X {
X(int i) : m_i(i) { }
int m_i;
};
int main() {
// correct
const X cx(10);
const X * pcx = &cx;
const X ** ppcx = &pcx;
// also correct
X const cx2(20);
X const * pcx2 = &cx2;
X const ** ppcx2 = &pcx2;
}