какова цель объявления b в качестве указателя на массив 10 из int - PullRequest
3 голосов
/ 31 октября 2011

видите, я видел какой-то код типа

int (*b)[10];

, что означает

declare b as pointer to array 10 of int

, поэтому я хочу спросить вас, какова цель этого?

почему бы нам не написать вместо этого просто

int array[10];

и использовать в качестве передаваемого адреса массива.

оба одинаковы или отличаются?

Править: Не путайте с

int *b[10];  // this one declare b as array 10 of pointer to int

и

int (*b)[10];  // this one declare b as pointer to array 10 of int

еще одним правкой

см. int (*b)[10];

1> выделит память для 10 элементов типа int, а адрес этой памяти будет назначен b?

или

2> не будет памяти, выделенной для массива.здесь говорится, что b способен содержать адрес и массив из 10 элементов?

какой вариант подходит?если кто-то прав, то почему следует использовать этот сложный синтаксис, а не другой метод?

Ответы [ 3 ]

1 голос
/ 31 октября 2011

Есть разница на самом деле.В 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 имен.Это дает больше читаемости тем, кто будет читать ваш код, и подчеркивает его правильность ...

0 голосов
/ 31 октября 2011

C позволяет использовать имя массива без индекса в качестве значения r, означающего адрес базы массива. Это также позволяет неявно разыменовать указатель со смещением, поскольку обычно к массиву обращаются. Поэтому объявления логически и синтаксически эквивалентны тогда и только тогда, когда b никогда не нужно указывать на другой массив или другой элемент того же массива. Технически они отличаются тем, что int b[10] требует sizeof(int)*10 байтов для хранения массива, а int (*b)[10] требует дополнительных sizeof(int*) байтов для хранения указателя на указанный массив. Если массив объявлен вне функции, для доступа к элементам int b[10] может использоваться меньший код операции и на один меньше регистров.

Я рекомендую объявить это, поскольку вы планируете использовать это. Если вы не знаете, почему это может быть указатель, объявите его как массив. Если он должен быть динамически размещен в куче, переустановлен или объявлен как параметр функции, это должен быть указатель.

0 голосов
/ 31 октября 2011

int (*b)[10] - указатель на массив int, int b[10] - массив int. (В следующий раз, может быть, выберите другие имена?) Возможно, вы хотите malloc хранилище массива, b = malloc(sizeof(*b)). Для этого вам понадобится указатель на тип массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...