Цель разыменования указателя как параметра в C - PullRequest
1 голос
/ 01 апреля 2010

Я недавно пришел по этой строке кода:

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

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

a->b

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

(*a).b

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

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

Если это так, то какой смысл проходить в

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

Спасибо.

Ответы [ 3 ]

5 голосов
/ 01 апреля 2010

Это:

&(*em).vdata

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

em.vdata

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

&((*em).vdata)

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

1 голос
/ 01 апреля 2010

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

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

0 голосов
/ 01 апреля 2010

"Если это так, то какой смысл передавать & (* a) как параметр, а не просто как?"

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

...