В новинку для C++. Вопрос о постоянных указателях

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

Это даже имеет "кучу" встроенных стилей...

5
задан Nick Dandoulakis 10 July 2009 в 15:45
поделиться

10 ответов

Простой способ запомнить, как const работает с указателями, - это помнить, что она всегда применяется ко всему, что находится слева от нее, за исключением крайнего левого ключевого слова, и в этом случае оно применяется к справа.

Примеры:

Указатель на постоянный символ: Указатель можно изменить так, чтобы он указывал на что-то еще, но символ, на который он указывает изначально, не может изменить значение.

const char * p;

Постоянный указатель на символ: Указатель нельзя изменить так, чтобы он указывал на что-либо еще, но символ, на который он указывает, может изменить значение.

char *const p;

Постоянный указатель на постоянный символ: Указатель нельзя изменить так, чтобы он указывал на что-либо еще, а символ, на который он указывает, не может изменить значение.

const char *const p;
18
ответ дан 18 December 2019 в 05:31
поделиться

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

Купите себе компилятор C ++, если хотите изучить C ++. g ++ является бесплатным, как и Visual Studio 2008 Express Edition.

Что касается вашего вопроса, константный указатель - это зона памяти, которая только готова. Пример: класс может предоставлять доступ только для чтения к внутреннему буферу.

Обратите внимание, что у вас также есть константный указатель, который также является константным, иначе

const char * const p 

В этом случае даже значение указателя не может быть изменено.

3
ответ дан 18 December 2019 в 05:31
поделиться

Добрый день,

Чтобы легко запомнить это, вы можете использовать уловку, которую Скотт Мейерс описывает в своей превосходной книге «Эффективный C ++» ( дезинфицированная ссылка Amazon )

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

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

Кстати, эта книга отличная, и хотя она не для новичка, она определенно способ вывести свои знания C ++ на новый уровень! Настоятельно рекомендуется.

HTH

ура,

2
ответ дан 18 December 2019 в 05:31
поделиться

Константный указатель означает, что вы можете изменить значение переменной, на которую указывает указатель, но вы не можете изменить место нахождения указателя. Я сам не часто использую их, но обычное применение константных указателей - определение определенных сегментов памяти, которые вам нужно адресовать. См. этот вопрос для получения дополнительной информации.

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

1
ответ дан 18 December 2019 в 05:31
поделиться

Постоянный указатель может означать несколько разных вещей. Я рекомендую ознакомиться с C ++ FAQ Lite по этому вопросу.

Вы можете иметь:

const int* p;
int* const p;
const int* const p;

Все три значения означают разные вещи. Да, это немного сбивает с толку.

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

9
ответ дан 18 December 2019 в 05:31
поделиться

Ваш код недействителен. Вы не можете присвоить aPointer (за исключением использования инициализации в стиле копирования, которая на самом деле не является присваиванием, хотя и выглядит так), если aPointer объявлен таким образом const. ] Но обычно, когда люди говорят «константный указатель», они имеют в виду const int * aPointer , а не int * const aPointer , как в вашем коде. Весь интернет объяснит разницу в мгновение ока. Насколько мне известно, термин «константный указатель» не определен в стандарте, поэтому мы можем сделать это, даже если это может сбивать с толку. «Указатель на константу» был бы недвусмысленным описанием, а указатель на константу используется гораздо чаще, чем указатель, который есть сама константа.

Указатель-который-есть-сама-константа используется для ссылки на что-то, где вы не хотите, чтобы указатель ссылался на другой объект в любой момент своей жизни. Например, this является указателем-который-сам-есть-const, потому что «этот объект» остается тем же самым объектом при выполнении функции-члена. Язык C ++ решил не позволять вам частично решить, что вы хотите присвоить какое-то другое значение this , чтобы оно ссылалось на какой-то другой объект. В C ++ ссылки также часто служат этой цели, поскольку их нельзя "переустановить" для изменения ссылки.

1
ответ дан 18 December 2019 в 05:31
поделиться

Поскольку вы новичок в C ++, для ответа на этот вопрос и многие другие вопросы, которые у вас могут быть или не известны, ознакомьтесь с FAQ по C ++

0
ответ дан 18 December 2019 в 05:31
поделиться

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

Это допустимо до первого удаления. Последующее новое не будет работать, потому что оно присваивается константе.

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

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.";
0
ответ дан 18 December 2019 в 05:31
поделиться

Как уже отмечалось, наиболее распространенным указателем на константу является

const char* p;

Переменная p может изменяться, но данные, на которые указывает p, не могут быть изменены.

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

char const* p;

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

char const* const* p;

Опять же, переменная p может измениться, и указанные данные нельзя изменить. Кроме того, данные объявляются как константные указатели, что означает, что они указывают на данные, которые не могут быть изменены.

Более распространенная запись для этого типа -

const char* const* p;

Размещение ключевого слова const непосредственно слева от звездочки, которую оно изменяет (или амперсанда для справки) упрощает создание сложных типов с использованием ключевого слова const.

0
ответ дан 18 December 2019 в 05:31
поделиться

У меня нет доступного компилятора, иначе я бы попробовал это

У всех есть компилятор C ++, доступный для них: http: // www .online-compiler.com

Есть много других, но, похоже, это работает ...

0
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: