Вопрос о символьном указателе C ++ - PullRequest
2 голосов
/ 08 августа 2011

Я все еще очень плохо знаком с C ++, и меня очень смущает то, что выглядит примерно так:

int main()
    {
         char* aCharPointer = "A bunch of characters";
         return 0;
    }

Почему вы можете сделать это с помощью указателя символов?Возможно, есть другое место с ответом, но я не знаю, где искать или что я ищу.Спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Это связано со строками в C (и не ошибайтесь, это строка C).Строки - это массив символов.Следующий код:

char* txt = "Hello";

Создает следующий массив символов:

H|e|l|l|o|\0

И txt указывает на первый элемент.Последний элемент является нулевым терминатором, и это то, как что-либо, использующее строку, знает, что строка завершилась.

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

Таким образом, так было, таким образомтак будет всегда.Аминь.

Если вам интересно, как создать строку C ++, используйте класс std::string.

2 голосов
/ 08 августа 2011

Что вы можете сделать?

«Куча символов» - это string literal. Строковый литерал статически размещается в постоянном разделе вашей программы. Эффект char *p = "LITERAL"; заключается в создании указателя в стеке для указания на этот строковый литерал.

enter image description here

Поскольку p указывает на константу, исходное определение было бы const char *p = "LITERAL"; Однако, чтобы быть обратно совместимым со многими существующими кодами C, все в порядке с предыдущей формой определения.

2 голосов
/ 08 августа 2011

Это строка в стиле C, что означает, что это действительно массив символов с нулевым символом (код ASCII 0) в конце строки, указывающий, что это конец (компилятор вставляет его для вас, когдаон видит литерал).

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

К указателям может быть применен синтаксис нижнего индекса p[i], который идентичен высказыванию *(p + i).Это общая идиома для доступа к i -ому элементу массива с указателем на первый элемент.

Используя эти факты, вы можете перебирать все символы в массиве следующим образом:

// '\0' is the null character
for (int i = 0; aCharPointer[i] != '\0'; ++i) {
    // Do something with aCharPointer[i]
}

или так:

for (char *p = aCharPointer; *p != '\0'; ++p) {
    // Do something with *p
}

Вы также можете вызвать функцию, для которой требуется указатель символа на строку в стиле C:

#include <cstring>
size_t lengthOfString = strlen(aCharPointer);

Вы можете, изРазумеется, также вручную разыменовываем указатель:

assert(*aCharPointer == 'A');
...