Указатель хранит строки? - PullRequest
0 голосов
/ 24 мая 2018

Я недавно начал изучать c ++ и наткнулся на концепцию указателя (которая является переменной, которая хранит адрес другой переменной).Однако я также столкнулся с char* str = "Hello", и я запутался.Таким образом, похоже, что «Hello» присваивается указателю str (который я, хотя мог хранить только адреса).Так может ли указатель также хранить строку?

Ответы [ 5 ]

0 голосов
/ 24 мая 2018

Переменная char * - это указатель на один байт (char) в памяти.Наиболее распространенный способ обработки строк называется строкой в ​​стиле c, где char * - это указатель на первый символ в строке, за которым следуют остальные символы в памяти.Строка c всегда будет заканчиваться символом «\ 0» или нулем, чтобы обозначить, что вы достигли конца строки («H», «e», «l», «l», «o», «\ 0 ').

"Hello" называется строковым литералом.То, что происходит в памяти, происходит в самом начале вашей программы, прежде чем что-либо еще выполняется, программа выделяет и устанавливает память для строки «Hello», в которой находятся другие статические константы.Когда вы пишете char * str = "Hello"; Компилятор знает, что вы используете строковый литерал, и устанавливает str в расположение первого символа этого строкового литерала.

Но будь осторожен.Все строковые литералы хранятся в той части памяти, в которую вы не можете писать.Если вы попытаетесь изменить эту строку, вы можете получить ошибки памяти.Чтобы этого не происходило, при работе с c-строками всегда следует писать const char * str = "Hello"; Таким образом, компилятор никогда не позволит вам изменить эту память.

Чтобы иметь изменяемую строку, вам нужно будет самостоятельно распределить и управлять памятью.Я бы предложил использовать std :: string или повеселиться и создать собственный класс string, который обрабатывает память.

0 голосов
/ 24 мая 2018

в строках c / c ++ хранятся в виде массива символов.Буквенная строка типа «Hello» фактически возвращает начало временного массива только для чтения, который содержит эту строку.

0 голосов
/ 24 мая 2018

В этом примере указатель является адресом первого символа в строке.Это унаследовано от C, где «строка» - это массив символов, оканчивающихся символом NULL.В C и C ++ массивы и указатели тесно связаны.Когда вы делаете свое собственное управление памятью, вы часто создаете массив с указателем на первый элемент массива.Это именно то, что здесь происходит с массивом, содержащим строковый литерал "Hello".

0 голосов
/ 24 мая 2018

Для дальнейшего использования вы должны использовать языковой тег только того языка, который вы используете.C и C ++ - это два очень разных языка, и в этом случае означает разницу.

Сначала общая часть: буквенные строки, такие как "Hello", хранятся вкомпилятор в виде массивов.В случае "Hello" это массив из шести char элементов, включая строковый нулевой терминатор.

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

И, наконец, на ваш вопрос: как и во всех массивах, использование их превращает их в указатель на их первый элемент, и это в основном то, что происходитВот.Вы заставляете вашу переменную str указывать на первый элемент в строковом литеральном массиве.

Немного упрощенно это можно увидеть так (в C ):

char anonymous_literal_array[] = "Hello";
...
char *str = &anonymous_literal_array[0];  // Make str point to first element in array
0 голосов
/ 24 мая 2018

Указатель будет хранить адрес начала строки, следовательно, первый символ.В этом случае «Hello» является неизменным литералом.( Проверьте разницу: постоянная и постоянная )

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

Поскольку char* является указателем на char, он точно указывает на char.

...