В C, как вы получаете доступ к переменной в структуре, которая находится в массиве указателей? - PullRequest
2 голосов
/ 07 октября 2010
typedef struct {
    employeeT *employees;
    int nEmployees;
} *payrollT;

typedef struct {
    string name;
} *employeeT;

Мне нужно сделать это, не обращаясь к нему как к массиву:

employeeT e = payroll.employees[i];

но это дает мне ошибку (ожидаемый идентификатор перед '(' токеном):

employeeT e = payroll.(*(employee+i));

до структурирования я мог поменять сотрудников [i] и * (employee + i)

Ответы [ 5 ]

3 голосов
/ 07 октября 2010

Зачем вам нужно избегать синтаксиса массива?

*(ptr+offset) == ptr[offset], строго каждый раз.

У вас НЕТ снижения производительности, а синтаксис массива более понятен.

<ч />

РЕДАКТИРОВАТЬ: Я только что понял суть проблемы.

Если payroll (в вашем примере) является типом указателя, вам нужно использовать оператор стрелки вместо оператора точки:

payroll->employees[0]
1 голос
/ 07 октября 2010

Как уже отмечалось,

employeeT e = *(payroll.employees + i);

(или *(payroll->employees + i), если payroll - это указатель, а не сама структура), работает отлично.

Но вернемся к вашему вопросу; почему вы думаете, что вы не можете получить доступ к payroll.employees с синтаксисом массива? Стандарт C совершенно ясен в том смысле, что два выражения эквивалентны - это фактически определение оператора индекса массива [ ] ( §6.5.2.1 Подстановка массива ):

Определение индекса оператор [] в том, что E1 [E2] идентично (* ((E1) + (E2))). Так как правил конвертации, которые применяются к бинарный оператор +, если E1 является объект массива (эквивалентно указатель к начальному элементу массива объект) и E2 является целым числом, E1 [E2] обозначает Е2-й элемент Е1 (считая с нуля).

0 голосов
/ 08 октября 2010

Вы должны вспомнить использование struct с. Попробуйте *(payroll.employee+i).

Редактировать: Или вы можете использовать (*payroll).employee[i].

0 голосов
/ 07 октября 2010
employeeT e = *(payroll.employee+i);

должен сделать работу.

0 голосов
/ 07 октября 2010

Ну, вы можете сделать:

employeeT e = *(payroll.employees+i);

но что не так с синтаксисом массива?Это, конечно, понятнее.

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