Это объявление массива символов
char name[] = "Cameron";
эквивалентно следующему объявлению
char name[8] = { 'C', 'a', 'm', 'e', 'r', 'o', 'n', '\0' };
Это тип объекта name
- char[8]
.
Вы можете написать, например, используя typedef
typedef char T[8];
, а затем объявить массив как
T name = { 'C', 'a', 'm', 'e', 'r', 'o', 'n', '\0' };
Таким образом, объявление указателя на массив будет выглядеть как
T *pName = &name;
где T, как было показано выше, равно char[8]
. Таким образом, заменив псевдоним для типа, который он обозначает, у вас будет
char ( *pName )[8] = name;
Для вывода строки, на которую указывает указатель, вы теперь можете написать
printf("Dereferencing pointer and printing string: %s\n", *pName);
Разыменование указателя *pName
дает lvalue массива, который, в свою очередь, неявно конвертируется в указатель на его первый элемент и имеет тип char *
. Таким образом, чтобы использовать спецификатор преобразования %s
yo должен предоставить выражение типа char *
.
Что касается этого объявления
char * pName = &name;
, когда оно неверно, потому что в левой части есть объект типа char *
, в то время как в правой части находится выражение типа char ( * )[8]
, и нет неявного преобразования из одного типа в другой.
Вы можете просто написать
char * pName = name;
Как было сказано выше, lvalue массива неявно конвертируется в указатель на его первый элемент и имеет тип char *
. И вы можете писать с помощью этого указателя
printf("Dereferencing pointer and printing string: %s\n", pName);