Подтвердить что ты не робот

Использование стрелки → и точки. операторов вместе в C

У меня создалось впечатление, что доступ к данным из под node связанного списка или подобной структуры можно было использовать с помощью операторов стрелок и точек следующим образом:

typedef struct a{
int num;
struct a *left;
struct a *right;
}tree;

tree *sample;
...
if(sample->left.num > sample->right.num)
    //do something

но когда я пытаюсь реализовать это, используйте → и. для доступа к данным из запроса sub node я get the error "для члена num в чем-то не структуре или объединении".

4b9b3361

Ответ 1

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

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

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)

Ответ 2

Так как я не вижу его явно:

  • Используйте → для разыменования указателя слева и доступа к элементу с правой стороны.
  • Использовать. для доступа к элементу с правой стороны переменной с левой стороны.

Ответ 3

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

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

Ответ 4

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

struct S {
int x;
}

S test;
test.x;

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

Ответ 5

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

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