Объявления C основаны на типах выражений, а не объектов.
Например, предположим, что у вас есть указатель на целое число с именем p
, и вы хотите получить доступ к значению, которое указывает p
. Вы бы использовать оператор разыменования *
так:
x = *p;
Выражение *p
дает значение типа int
, поэтому заявление пишется как
int *p; // which is parsed as int (*p); the * is bound to the identifier p,
// not the type specifier
Для более сложного примера, у вас есть массив указателей на char
, и вы хотите получить доступ к указанному символу. Вы бы индекса в массиве и разыменования результат:
c = *a[i]; // which is parsed as `*(a[i])`
Опять же, тип выражения*a[i]
является char
, поэтому декларация a
написана
char *a[N];
Так, пройдя через конкретные примеры:
char *word; // word is a pointer to char
char **word; // word is a pointer to a pointer to char
char array[]; // array is an array of char
char *array[]; // array is an array of pointers to char
Обратите внимание, что объявление массива must включает размер или имеет инициализатор; ваши объявления массива неверны.
Массив подстрочный оператор []
и вызов функции ()
имеют более высокий приоритет, чем унарный *
, так:
T *a[N]; // a is an N-element array of pointer to T
T (*a)[N]; // a is a pointer to an N-element array of T
T *f(); // f is a function returning a pointer to T
T (*f)(); // f is a pointer to a function returning T
Вы должны пройти через основной учебник. – Maroun
Прочитайте [K & R] (http://books.cat-v.org/computer-science/c-programming-language/The.C.Programming.Language.2nd.Edition.pdf) – stackptr