2010-04-01 1 views
1

Я недавно по этой строке кода:Цель разыменования указателя в качестве параметра в C

CustomData_em_free_block(&em->vdata, &eve->data); 

И я подумал, не стоит:

a->b 

просто синтаксический сахар для:

(*a).b 

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

CustomData_em_free_block(&(*em).vdata, &(*eve).data); 

Если это так, что точка перехода в

& (* а), в качестве параметра, и не только? Кажется, что указатель-эквивалент - (-a) передается внутри, есть ли для этого какая-либо логика?

Спасибо.

ответ

6

Это:

&(*em).vdata 

не то же самое, как это:

em.vdata 

Это то же самое, как это:

&((*em).vdata) 

Амперсанд принимает адрес vdata, который является членом структуры, на которую указывает em. Оператор . имеет более высокий приоритет, чем оператор &.

+0

Я согласен с частью единорога. Во всяком случае, это имеет смысл. Так что в этом случае:. (& (* а)) б такая же, как: a.b, но без дополнительных() там, чтобы изменить порядок операций, скалярное произведение бывает первым, верно? Спасибо. –

+0

@Leif Andersen: Да, '(& (* a)) == a'; вот в чем смысл этих двух операторов. И да, '.' имеет более высокий приоритет, чем' & '. Это не точечный продукт, но это оператор выбора членов. – Cascabel

+0

@Leif Andersen: вы можете использовать Google для приоритета оператора C; вот таблица по википедии: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence – Cascabel

1

Вот что вам не хватает: &em->vdata - это то же самое, что и у &(em->vdata), а не (&em)->vdata. То есть, это адрес члена vdata, на который указывает em. Это должно быть ясно, если вы посмотрите на тип em - это указатель.

Да, вы всегда можете переписать a_ptr->member как (*a_ptr).member, но зачем беспокоиться? В этом суть синтаксического сахара.

-1

«Если это так, то какова точка прохождения в & (* a), как параметр, а не только?»

Обычно нет. Но обратите внимание, что ваш пример кода не сравнивается с & (* a) и a. В вашем примере кода сравниваются & (* a) и b, где b смещается от a на любое расстояние от начала em до члена vdata em.

Смежные вопросы