Вопрос по использованию массива в качестве указателя на C - PullRequest
1 голос
/ 17 февраля 2011

Например.У меня есть массив структур «а», как показано ниже:

struct mystruct{
    int b
    int num;
};
struct bigger_struct {
   struct my_struct a[10];
}

struct bigger_struct *some_var;

Я знаю, что имя массива при использовании в качестве значения неявно ссылается на адрес первого элемента массива.как работает оператор индекса массива по крайней мере) Могу ли я знать, как поступить наоборот, т.е. если я сделаю:

some_var->a->b, это должно быть эквивалентно some_var->a[0]->b, я прав?Я проверил это, и это похоже на работу, но это семантически правильно на 100%?

Ответы [ 3 ]

8 голосов
/ 17 февраля 2011

some_var->a->b эквивалентно some_var->a[0]->b?

Нет, оно эквивалентно some_var->a[0].b.

Точная спецификация преобразования массива в указатель на самом деле довольно проста:

За исключением случаев, когда это операнд оператора sizeof или унарный оператор &или строковый литерал, используемый для инициализации массива; выражение с типом массив типа преобразуется в выражение с типом , указывающее на тип , указывающее на начальный элементобъект массива и не является lvalue (C99 6.3.2.1).

some_var->a имеет тип my_struct[10], который является типом массива, и поскольку он не является операндом sizeof или унарный оператор & и не является строковым литералом, он преобразуется в указатель на начальный элемент массива.

0 голосов
/ 17 февраля 2011

Да, _var->a[0]->b и _var->a->b эквивалентны

, поскольку a[0] и a представляет базовый адрес структуры.

0 голосов
/ 17 февраля 2011

Предполагая, что вы выделили память для some_var, это безопасно сделать some_var->a->b (так как массивы распадаются на указатель).

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