Почему это указание на постоянное указание указателя является незаконным? - PullRequest
0 голосов
/ 05 июня 2018
int x = 10;
int * const p = &x;
const int **p1 = &p;

Возникли проблемы с пониманием того, почему это незаконно.

РЕДАКТИРОВАТЬ

Спасибо за все великолепные ответы.Вот моя интерпретация ответов, не стесняйтесь не соглашаться.Итак, ошибка в 3-й строке.Это подразумевает, что исходное целое число является константой, но не подразумевает, что указатель, на который он указывает, является константой, и поэтому это недопустимо, потому что мы можем попытаться изменить указатель с «p» на «p1», что невозможно, поскольку это указатель с константой.Таким образом, чтобы исправить это, третья строка должна быть:

int * const *p1 = &p;

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

const int * const *p1 = &p;

Это говорит то же самое, но также говорит о том, что вы не можете изменить исходное целое число, потому что оно постоянное.

Ответы [ 5 ]

0 голосов
/ 05 июня 2018

Инициализирует новый изменяемый int x с литералом 10, штраф:

int x = 10;

Инициализирует новый постоянный указатель на изменяемый int p с адресом x, штраф:

int * const p = &x;

Инициализирует новый изменяемый указатель на изменяемый указатель на постоянную int с адресом p, нарушение ограничения из-за удаления const, а также из-за добавления самого внутреннего const:

const int **p1 = &p;
// Normally qualifiers go to the right of the type they qualify
// The inner-most qualifiers can be put before them though without introducing ambiguity

Ознакомьтесь с полными правилами на cppreference.com или непосредственно в стандарте, они немного длинны.

0 голосов
/ 05 июня 2018

In

int * const p = &x;

, что означает, что адрес / ссылка постоянны, поскольку const следует после * (в отличие от целевого значения, являющегося постоянным, в другихслова const перед *, другими словами const int *p)

In

const int **p1 = &p;

, что означает p1, что я будувызывать «внешний указатель» указывает на const int *, что неверно, потому что он должен указывать на int *const, как указано в предыдущем выражении.

Другими словами, как выразился компилятор,

error: cannot initialize a variable of type 'const int **' with an rvalue of type 'int *const *'
const int **p1 = &p;
0 голосов
/ 05 июня 2018

Компилятор (здесь, gcc) сообщает вам

invalid conversion from 'int* const*' to 'const int**' [-fpermissive]

И причина в том, что

p1 является указателем на (не const) указатель на const int

, в то время как

p является указателем const на int

Если присваивание было допустимым, вы можете изменить переменную const от p до p1 (тип * p1 будет const int * - указатель на const int).

0 голосов
/ 05 июня 2018

Объявляет 2 постоянных значения:

int const x1 = 3;
const int x2 = 3;

Объявляет указатель, данные которого нельзя изменить с помощью указателя:

const int *p = &someInt;

Объявляет указатель, который нельзя изменить, чтобы он указывал начто-то еще:

int * const p = &someInt;

Ссылка: const int = int const?

0 голосов
/ 05 июня 2018

К объявлениям указателей вам нужно привыкнуть, что вам нужно читать их справа налево.Важно то, что на каждой стороне *

int * const p означает p это константный указатель для неконстантного целого

const int **p1 означает, p1 - это неконстантный указатель на неконстантный указатель на const int

Ваше второе объявление не выполняется, потому что оно создает неконстантную переменную из константной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...