Рассмотрим следующее:
char* a;
char* const b = "Hello"
const char* c;
const char* const d = "world";
a
просто указывает на персонажа. Это может быть первый символ строки или один байт. Этот символ можно изменить, написав *a='Z'
или a[0]='q'
или передав a
в функцию, принимающую параметр char*
. Сам указатель также можно изменить, чтобы он указывал на некоторые другие символы, например a=b;
или a="foo";
. Это наиболее гибкая и наименее безопасная форма, поскольку с ней можно делать все что угодно.
b
- постоянный указатель на символ. В этом случае он указывает на массив символов. Эти символы могут быть изменены, например, b[1]='a';
или *b=0;
, но b
сам по себе является постоянным, что означает, что он никогда не может указывать на другую часть памяти. Эта форма может использоваться, когда вы выделили буфер или массив, содержимое которого вы хотите изменить, но которое не может быть перемещено, поскольку оно было выделено операционной системой.
c
указывает на постоянный символ. Вы можете изменить то, на что он указывает (c="foo";
или c=b;
), но вы не можете использовать этот указатель для изменения символов, на которые он указывает, - , даже если он указывает на непостоянный буфер b
. Эта форма обычно используется при обработке предварительно сгенерированных строк. Вы можете использовать эту переменную для хранения найденных строк и передачи их адресов, если только вы не изменили сами строки.
d
- постоянный указатель на постоянный символ. Вы не можете изменить символы, на которые он указывает, и вы не можете направить сам указатель в другое место в памяти. Все, что вы можете сделать, это прочитать строку или отдельные символы (char e=d[4];
или puts(d);
). Эта форма в основном используется при передаче строк ссылок, например, при именовании реальных объектов.