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

#c #programming-languages

#c #программирование-языки

Вопрос:

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

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

Комментарии:

1. cdecl.org твой друг.

Ответ №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-разрядные числа из десятичной системы в шестнадцатеричную в моей голове — я могу, если нужно, но это намного проще с помощью инструмента 🙂

Комментарии:

1. На самом деле я предпочитаю C, поскольку он часто более понятен, чем английский (возможно, потому, что я не являюсь носителем языка).

Ответ №2:

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

Комментарии:

1. 1 Также массивы не являются указателями, а указатели не являются массивами 🙂 … @Hanafuda: прочитайте раздел 6 c-faq … и добро пожаловать в SO .