Используя стрелку -> и точку.операторы вместе в C - PullRequest
13 голосов
/ 01 мая 2011

У меня сложилось впечатление, что было возможно получить доступ к данным из подузла связанного списка или подобной структуры, используя операторы со стрелками и точками вместе, например так:попробуйте реализовать это, используя -> и.для доступа к данным из подузла я получаю сообщение об ошибке «запрос на членский номер в чем-то, не являющемся структурой или объединением».

Ответы [ 5 ]

25 голосов
/ 01 мая 2011

Используйте -> для указателей;используйте . для объектов.

В вашем конкретном случае вы хотите

if (sample->left->num > sample->right->num)

, потому что все sample, sample->left и sample->right являются указателями.

Если вы конвертируете любой из этих указателей в указатель на объект;используйте . вместо

struct a copyright;
copyright = *(sample->right);
// if (sample->left->num > copyright.num)
if (*(sample->left).num > copyright.num)
9 голосов
/ 09 мая 2011

Так как я не вижу, чтобы это было упомянуто явно:

  • Используйте -> к разыменуйте указатель с левой стороны и получите доступ к элементу с правой стороны.
  • Использование.чтобы получить доступ к члену с правой стороны , переменная с левой стороны.
3 голосов
/ 01 мая 2011

sample-> left дает struct a*, а не struct a, поэтому мы имеем дело с указателями.Таким образом, вы все равно должны использовать ->.

Однако вы можете использовать sample->left->num.

2 голосов
/ 01 мая 2011

.предназначен для доступа к членам структуры (или объединения), например

struct S {
int x;
}

S test;
test.x;

-> это более короткий способ записи (* pointer_to_struct) .struct_member

0 голосов
/ 01 мая 2011

sample->left и sample->right также являются указателями, поэтому вы хотите:

if (sample->left->num > sample->right->num) {
    // do something
}
...