2014-11-22 2 views
2

Учитывая примерПонимание Указатель на постоянной указатель на целую константу (сопзЬ Int * сопзЬ * переменная)

const int limit = 500; 
const int * const cpci = &limit; 
const int * const * pcpci = &cpci; 

Я с трудом понимая, что означает, что последняя строка.

В основном в терминах массива значение pcpci - это просто массив (const int * const). Но я не могу сделать несколько копий внутри pcpci, поскольку он не должен быть постоянным указателем.

Для примера

const int limit = 500; 
const int * const cpci = &limit; 
const int * const * pcpci = &cpci; 
const int limit2 = 600; 
const int * const cpci2 = &limit2; 
*(pcpci+1) = &cpci2; 

В последней строке кода выше я получил «ошибка-значение должно быть изменяемым». Но мне было интересно, почему это происходит, поскольку pcpci не является постоянным указателем, и только его элементы должны быть постоянными и не изменяемыми.

+0

Это не имеет никакого отношения к массивам. – EOF

+0

«* pcpci это просто массив *« Нет, указатели не массивы. – alk

ответ

2

Прежде всего это заявление

*(pcpci+1) = &cpci; 

имеет неопределенное поведение, потому что вы не можете разыменования указателя, который не указывает на объект. Вы можете использовать эту конструкцию, если pcpci будет указывать на элемент массива, а pcpci + 1 также укажет на следующий элемент того же массива.

Так было бы более coorectly написать

*(pcpci) = &cpci; 

Однако объект, на который указывает pcpci является постоянным объектом с типом T const где Т const int * поэтому он не может быть переназначен.

Это было бы более понятно, вы можете переписать определение

const int * const * pcpci = &cpci; 

следующим образом

typedef const int * const ConstPointerToConstObject; 

ConstPointerToConstObject * pcpci = &cpci; 

Так что, если derefernce pcpci вы получите объект типа ConstPointerToConstObject, который не может быть изменен, так как это постоянный указатель постоянному объекту.

2

Но мне было интересно, почему это происходит, поскольку pcpci не является постоянным указателем

Нет, но *(pcpci+1) есть. Он имеет тип const int* const. Очевидно, вы не можете ничего ему назначить.

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