2013-02-08 4 views
1

Я ничего не понимаю здесь. В следующем коде я определил целое число и постоянное целое число.Используйте указатель const int * const для указания на int

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

Тот же указатель константы (int * const) не может указывать на постоянное целое число. См. Пятую строчку.

Постоянный указатель на константу (const int * const) может указывать на константное целое число. Этого я и ожидал.

Однако тот же самый (const int * const) указатель может указывать на не постоянное целое число. См. Последнюю строку. Почему и как это возможно?

int const constVar = 42; 
int variable = 11; 

int* const constPointer1 = &variable; 
int* const constPointer2 = &constVar; // not allowed 
const int* const constPointer3 = &constVar; // perfectly ok 
const int* const constPointer4 = &variable; // also ok, but why? 
+3

Кажется, что у вас есть недоразумение о том, что означает ключевое слово const. 'const int *' не означает «int, на который я указываю is is const», это означает «я не буду использовать этот указатель для изменения int, на который я указываю». Является ли int, на который вы указываете, const или нет, не изменяет того, что происходит. – Bill

+0

Спасибо за все ваши ответы и комментарии. Я ошибался, как писал Билл в своем комментарии. C++ иногда бывает трудно получить. –

ответ

1

Вы всегда можете решить не изменять неконстантную переменную.

const int* const constPointer4 = &variable; 

Просто разобрать определение: constPointer4 является константной (т.е. вы не можете изменить то, что это указывает на больше) указатель на константный междунар (т.е. variable). Это означает, что вы не можете изменять variableчерезconstPointer4, даже если вы можете изменить variable другими способами.

Другой путь (доступ к переменной const с помощью указателя, отличного от const), вам понадобится const_cast.

Почему указатель на константу полезен? Он позволяет иметь функции-члены const в классах, где вы можете гарантировать пользователям, что эта функция-член не изменяет объект.

1

const имеет меньше прав доступа, чем не const, поэтому он разрешен. Вы не сможете изменить «переменную» через указатель, но это не нарушает никаких правил.

variable = 4; //ok 
*constPointer4 = 4; //not ok because its const 

Вы часто используете эту функцию «const const to non const variable» при вызове функций.

void f(const int * const i) 
{ 
    i=4; //not ok 
} 

f(&variable); 
1
int const constVar = 42; // this defines a top-level constant 
int variable = 11; 

int *const constPointer1 = &variable;

int *const constPointer2 = &constVar; // not allowed because you can change constant using it

const int *const constPointer3 = &constVar; // perfectly ok. here you can't change constVar by any mean. it is a low level constant.

const int *const constPointer4 = &variable; // also ok, because it says you can't change the value using this pointer . but you can change value like variable=15 .

*constPointer4=5; //you get error assignment of readonly location.because that pointer is constant and pointing to read only memory location.

0

Указатель на константный объект не может б e используется для изменения этого объекта. Неважно, кто-то другой может его изменить; это просто невозможно сделать с помощью этого указателя.

int i;    // modifiable 
const int *cip = &i; // promises not to modify i 
int *ip = &i;  // can be used to modify i 

*cip = 3; // Error 
*ip = 3; // OK 
0

Line # 4

int* const constPointer2 = &constVar; 

Здесь не должно быть разрешено, так как INT * Const часть "междунар * Const constPointer2" означает, что указатель Contant, а затем, когда вы идете вперед и назначить это & constVar

0

с продолжением вопроса asked-

переменная 1.int = 5;

2.const INT * constpointer = & переменная // с помощью указателя мы не можем изменить значение переменной

3.variable = 6; // Теперь, что constpointer указывает на изменении противоречащим 2-ое заявление

В идеале 2-й оператор не должен допускаться, если только в 1-й операторной переменной не делается постоянным. Не так ли? Пожалуйста, поправьте меня, если я ошибаюсь.

Смежные вопросы