int foo[100];
объявляет foo
как массив из 100 штук. Тип foo
- int [100]
(просто удалите foo из его объявления).
int (*b)[100];
заявляет *b
как массив из 100 штук. И это означает, что b
- это указатель для такого массива. Таким образом, вы можете написать b = &foo; например. Тип b
- int (*)[100]
(опять же, просто удалите b из его декларации).
Но просто указывать на массив, как в приведенном выше примере, не очень интересно, потому что указатель на первый элемент foo
(т. Е. Указатель на int) достаточен для доступа к foo
. Нет необходимости в указателе на массив. Вместо этого b
интересно динамически выделять массив из int [100]
. Например:
b = (int (*) [100]) malloc(25 * sizeof(int [100])); // allocates an array of 25 int [100]
b[0][99] = 99; // correct
...
b[24][99] = 24099; // correct
b[24][100] = 24100; // incorrect because each b[i] is an array of 100 integers
b[25][0] = 25000; // incorrect because b is an array of 25 elements (an each element is an array)
Таким образом, ваша программа неправильно, потому что вы выделили массив одногоint [100]
только (на самом деле, 100 * sizeof(int) == sizeof(int [100])
). Таким образом, вы можете написать эти инструкции, которые идентичны:
b[0][0] = 0;
*(b[0]) = 0;
*b[0] = 0;
Но *b[1]
неверен.
Вы можете использовать http://cdecl.org, чтобы узнать, что означает это определение. – ForceBru
Если вы попытаетесь изучить C++, вы можете пропустить это и проверить вместо этого 'std :: vector'. –