2015-03-24 2 views
2

Я знаю, что указатель имеет адрес и ячейку содержимого, которая содержит адрес. Так что случилось с указателем в следующем коде:Почему я могу разыменовывать и изменять указатель `int * const`?

int a=5; 
int* const ptr=&a; 
*ptr=6; 

Адрес PTR трюмы не изменяется, так как может значение, PTR точки менять?

+3

Точно так же уличный адрес дома не изменение, когда оно продается, и новые жители перемещаются. Тот же дом, разные жители. –

+0

Вы действительно хотели 'const int * ptr = & a;' или, может быть, 'const int * const ptr = & a;'. –

+1

«Удержание адреса ptr не изменяется, так как может значение, которое ptr указывает на изменение» - точно. они ортогональны. Адрес, который имеет указатель, не имеет ничего общего с содержимым объекта, на который он указывает. –

ответ

5
int *const ptr = &a; 

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

Так

*ptr = 6; 

будет изменять значение переменной a в 6.

Что не допускается является наряду с существующим кодом, у вас есть

int b=5; 

и вы

ptr = &b; 

Тогда вы обязательно получите ошибку говоря постоянный указатель делается на укажите другую ячейку памяти.

0

Существует область 4-Byte в памяти, скажем, по адресу 0x2000, эта область называется «»

С инструкцией a=5 компилятор (или лучше стартап-код) заполняет эту область памяти с 4-байтовое целое число 0x00000005 (которое равно 5 в десятичной системе).

В настоящее время другая переменная ptr заполнена адресом of: ptr = 0x2000.

Указатель содержит адрес из области памяти a мы говорим ptr указывает на a

*ptr означает: область памяти ptr точек, в данном случае память на 0x2000.

Таким образом, наконец *ptr=6 означает, что целое число/значение 6 заполнено в область памяти ptr указывает на.

Теперь область памяти в 0x2000 будет содержать 0x00000006 (десятичное 6)


Редактировать

модификатор const в int* const ptr означает, что фактическое значение т.е. адреса в ptr не изменится во время выполнения программы он всегда будет указывать/содержать 0x2000.

Это означает, что назначение как

ptr = &b; 

завершится неудачно с сообщением об ошибке компилятора.

+1

Не могли бы вы решить задачу 'const' и почему это не мешает назначению? –

4

Если вы заходите в библиотеку и просите каталог, то с помощью каталога найдите книгу, а затем перейдите на другую книгу, а каталог по-прежнему будет перечислять в ней старую книгу.

Аналогичная вещь происходит в вашем коде - указатель (сама ссылка) не изменяется, но то, что он указывает на , делает изменение.

Если вы имели в виду, чтобы сделать объект, который он указывает, что const то вам нужно объявить его как таковой:

const int* ptr = &a; 

или, чтобы сделать как объект и указатель const:

const int* const ptr = &a; 
0

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

Позвольте мне дать вам возможность подумать об этом, что является хорошей иллюстрацией, но не должно быть буквальным. Тип указателя можно рассматривать как целое число без знака (вероятно, 32 или 64 бита в длину, но это не имеет значения прямо сейчас). В действительности все, что когда-либо хранится в указателе, представляет собой целое число без знака или Nil, которое для наших целей мы будем называть «ноль».

Если вы указали указатель на константу таким образом, вы делаете то, что это обычно означает; содержимое этой переменной является постоянным. Таким образом, число, попадающее в это целое без знака, не изменится.

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

0

Здесь указатель ptr имеет постоянный тип. Указатель константы не может изменить адрес после загрузки адреса.

В третьей строке *ptr=6; вы назначаете значение адресу, сохраненному в ptr pointer.ie.to a. Таким образом, только значение a изменений 6. Чтобы изменить адрес ptr удалить ключевое слово const и назначить адрес, как ptr=&b

0

Здесь указатель константы типа, используя этот указатель можно только указать один адрес памяти. Теперь вы не можете указать другой адрес, используя этот указатель

int a,c; 
int *const b=&a; 

и когда мы приписывать, как это, по ошибке

b=&c; 
Смежные вопросы