я на самом деле вижу Таблицы в Переполнении стека на пользовательской странице.
Это даже имеет "кучу" встроенных стилей...
Простой способ запомнить, как const работает с указателями, - это помнить, что она всегда применяется ко всему, что находится слева от нее, за исключением крайнего левого ключевого слова, и в этом случае оно применяется к справа.
Примеры:
Указатель на постоянный символ: Указатель можно изменить так, чтобы он указывал на что-то еще, но символ, на который он указывает изначально, не может изменить значение.
const char * p;
Постоянный указатель на символ: Указатель нельзя изменить так, чтобы он указывал на что-либо еще, но символ, на который он указывает, может изменить значение.
char *const p;
Постоянный указатель на постоянный символ: Указатель нельзя изменить так, чтобы он указывал на что-либо еще, а символ, на который он указывает, не может изменить значение.
const char *const p;
Нельзя научиться водить машину, просто читая книги.
Купите себе компилятор C ++, если хотите изучить C ++. g ++ является бесплатным, как и Visual Studio 2008 Express Edition.
Что касается вашего вопроса, константный указатель - это зона памяти, которая только готова. Пример: класс может предоставлять доступ только для чтения к внутреннему буферу.
Обратите внимание, что у вас также есть константный указатель, который также является константным, иначе
const char * const p
В этом случае даже значение указателя не может быть изменено.
Добрый день,
Чтобы легко запомнить это, вы можете использовать уловку, которую Скотт Мейерс описывает в своей превосходной книге «Эффективный C ++» ( дезинфицированная ссылка Amazon )
Вы проводите линию через объявление там, где расположена звездочка.
Кстати, эта книга отличная, и хотя она не для новичка, она определенно способ вывести свои знания C ++ на новый уровень! Настоятельно рекомендуется.
HTH
ура,
Константный указатель означает, что вы можете изменить значение переменной, на которую указывает указатель, но вы не можете изменить место нахождения указателя. Я сам не часто использую их, но обычное применение константных указателей - определение определенных сегментов памяти, которые вам нужно адресовать. См. этот вопрос для получения дополнительной информации.
Кстати, вы должны попробовать установить компилятор на свой компьютер, если сможете. Я много раз показывал себе, что человеческий мозг - плохой компилятор C ++.
Постоянный указатель может означать несколько разных вещей. Я рекомендую ознакомиться с C ++ FAQ Lite по этому вопросу.
Вы можете иметь:
const int* p;
int* const p;
const int* const p;
Все три значения означают разные вещи. Да, это немного сбивает с толку.
В вашем случае у вас есть второй, что означает, что у вас есть постоянный указатель на непостоянный объект. То есть вы можете изменить значение целого числа с помощью указателя, но не можете изменить то, на что указывает указатель. Таким образом, опубликованный вами код не будет законным.
Ваш код недействителен. Вы не можете присвоить aPointer
(за исключением использования инициализации в стиле копирования, которая на самом деле не является присваиванием, хотя и выглядит так), если aPointer
объявлен таким образом const. ] Но обычно, когда люди говорят «константный указатель», они имеют в виду const int * aPointer
, а не int * const aPointer
, как в вашем коде. Весь интернет объяснит разницу в мгновение ока. Насколько мне известно, термин «константный указатель» не определен в стандарте, поэтому мы можем сделать это, даже если это может сбивать с толку. «Указатель на константу» был бы недвусмысленным описанием, а указатель на константу используется гораздо чаще, чем указатель, который есть сама константа.
Указатель-который-есть-сама-константа используется для ссылки на что-то, где вы не хотите, чтобы указатель ссылался на другой объект в любой момент своей жизни. Например, this
является указателем-который-сам-есть-const, потому что «этот объект» остается тем же самым объектом при выполнении функции-члена. Язык C ++ решил не позволять вам частично решить, что вы хотите присвоить какое-то другое значение this
, чтобы оно ссылалось на какой-то другой объект. В C ++ ссылки также часто служат этой цели, поскольку их нельзя "переустановить" для изменения ссылки.
Поскольку вы новичок в C ++, для ответа на этот вопрос и многие другие вопросы, которые у вас могут быть или не известны, ознакомьтесь с FAQ по C ++
В вашем коде указатель не может перемещаться, но данные, на которые он указывает, могут изменяться.
Это допустимо до первого удаления. Последующее новое не будет работать, потому что оно присваивается константе.
Это относительно необычно видеть, чаще всего - видеть, где данные, на которые указывают, являются неизменными, но указатель может перемещаться.
int bar;
int baz;
const int * foo = &bar;
*foo = 4; // illegal
foo = &baz; // legal
имея и указатель, и значение константа обычна для строк
const wchar_t * const myString = L"String that will never change.";
Как уже отмечалось, наиболее распространенным указателем на константу является
const char* p;
Переменная p может изменяться, но данные, на которые указывает p, не могут быть изменены.
Однако перемещение константы ключевое слово слева от звездочки не меняет значения объявления:
char const* p;
Я предпочитаю более позднее, поскольку становится намного легче запомнить, где разместить ключевые слова const при объявлении указателей const на указатели const:
char const* const* p;
Опять же, переменная p может измениться, и указанные данные нельзя изменить. Кроме того, данные объявляются как константные указатели, что означает, что они указывают на данные, которые не могут быть изменены.
Более распространенная запись для этого типа -
const char* const* p;
Размещение ключевого слова const непосредственно слева от звездочки, которую оно изменяет (или амперсанда для справки) упрощает создание сложных типов с использованием ключевого слова const.
У меня нет доступного компилятора, иначе я бы попробовал это
У всех есть компилятор C ++, доступный для них: http: // www .online-compiler.com
Есть много других, но, похоже, это работает ...