2014-11-11 3 views
-5

Я очень новичок в C, и я немного разбираюсь в синтаксисе. Но я смущен относительно следующих различий. Если кто-то может объяснить их различия и что это значит, как я могу ими манипулировать. БлагодаряРазница между синтаксисом указателя и массива

char *word 
char **word 
char array[] 
char *array[] 
+4

Вы должны пройти через основной учебник. – Maroun

+0

Прочитайте [K & R] (http://books.cat-v.org/computer-science/c-programming-language/The.C.Programming.Language.2nd.Edition.pdf) – stackptr

ответ

1
char *word  //pointer to char 
char **word  //pointer to a pointer to a char 
char array[] //array of char of undefined size 
char *array[] //array of pointers to char of undefined size 

Теперь все, что вам нужно сделать, это прочитать книгу о указателях на «выяснение синтаксиса немного».

+0

Что вы подразумеваете под "undefined размер"? – haccks

+2

«Неопределенный размер» означает, что вы не дали ему размер, который указан внутри скобок. * Ex: * 'char word [128]' <-, который выделяет 128-элементный массив 'char'. – stackptr

+0

что касается char ** массив []? –

1

Объявления 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