В чем разница между (* p) [8] и * p [8] в C?

Два объявления следующие:

int (*p)[8];
int *p[8];

Ответ 1

Первый - это единственный указатель на массив из 8 целых чисел, а второй - массив из 8 указателей, каждый из которых имеет целое число.

Если вы просто поднимаете cdecl, это замечательно для такого рода вещей:

pax$ cdecl
Type `help' or `?' for help

cdecl> explain int (*p)[8];
declare p as pointer to array 8 of int

cdecl> explain int *p[8];
declare p as array 8 of pointer to int

cdecl> explain char*(*fp[])(int,float*);
declare fp as array of pointer to function (int, pointer to float)
    returning pointer to char

На самом деле правило по часовой стрелке/спирали, которое вы можете использовать, чтобы сделать это в своей голове, но мне не пришлось беспокоиться об этом, так как я обнаружил cdecl, по той же причине я больше не конвертирую большие произвольные 32-разрядные числа от десятичной до шестнадцатеричной в моей голове - я могу, если мне нужно, но это намного проще с инструментом: -)

Ответ 2

Первый p является указателем на массив из 8 int. Второй p представляет собой массив из 8 указателей на int.