Использование стрелки → и точки. операторов вместе в 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 в чем-то не структуре или объединении".
Ответы
Ответ 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
}