Есть разница на самом деле.В int b[10]
, b
является константой указателя (что означает, что ее можно использовать для изменения лежащих в ее основе данных, но ее нельзя изменить для указания чего-то другого).С другой стороны, указатель в int (*b)[10]
можно изменить, чтобы он указывал на что-то другое (а также, конечно, на возможность изменения базовых данных).Таким образом, разница в том, что, сказав, что b
есть int (*b)[10]
;Вы предупреждаете следующего разработчика, который видит ваш код, что этот b
может указывать на что-то еще в коде.Вот почему - очевидно - не делайте этого, за исключением случаев, когда вы действительно намереваетесь изменить то, на что указывает b
(в противном случае вы просто путаете, кто придет за вами).
Что касается вашего вопроса, я проверил, используя sizeof(b)
.
int (*b)[10]
==> sizeof(b)
равно 4 (что означает, что память не выделена - вариант 2).
int b[10]
==> sizeof(b)
равно 40 (что означает, что память распределяется должным образом - вариант 1).
Посмотрите на это:
int (*b)[10];
int x[10];
b = &x;
Это скомпилировано.Измените размер массива на что-нибудь еще.Это не скомпилируется!Это означает, что вы крайне правы :-D.Вариант 2 написан отлично: этот указатель может только указывать на массив размером 10 и больше ничего .
[Добавляется согласно запросувладельца вопроса]
В чем преимущество такого синтаксиса?Это просто функция, которая уже есть, и, возможно, она кому-нибудь пригодится.Вот как я это понимаю (и, пожалуйста, исправьте меня, если не прав): Например, вы можете сказать: string (*names_of_players_in_soccer_team)[11];
, и преимущество - очевидно - ограничение массива равным точно 11 именам для обработки логика приложения - у команды должно быть ровно 11 имен.Это дает больше читаемости тем, кто будет читать ваш код, и подчеркивает его правильность ...