char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
В C вещь слева от '=' называется 'lvalue'. Тип определяется исключительно значением lvalue. Таким образом, amessage - это массив символов. 'pmessage' - указатель на символ.
В Си больше идет о том, что эквивалентно между типом массива и доступом 'char *', а также тем, что нет.
Как объявлено, «pmessage» является изменяемым «lvalue» - «amessage» не может быть изменено. Следовательно, советуем объявить «pmessage» как const, поскольку на самом деле он также не должен изменяться.
1008 * Е.Г. *
const char* const pmessage = "...";
С точки зрения доступа к памяти «amessage» приводит к прямому доступу, тогда как «pmessage» требует разыменования.
Примечание: компилятор C разрешает инициализацию 'char *' только во время компиляции через строковый литерал.
например. Если бы у вас было
1. {
2. int j = 1;
3. int *k = &j;
4. int *i = 1;
5. }
Строка 4 не имеет смысла и будет незаконной.
Настоятельно рекомендую «Deep C Secrets» Питера Ван Линдена, в котором у него есть целая глава, посвященная массивам и указателям на C.