简体   繁体   中英

Using arrow -> and dot . operators together in C

I was under the impression that it was possible to access data from a sub-node of a linked list or similar structure by using the arrow and dot operators together like so:

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

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

but when I try to implement this, using -> and. to access data from a sub node I get the error "request for member num in something not a structure or union".

Use -> for pointers; use . for objects.

In your specific case you want

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

because all of sample , sample->left , and sample->right are pointers.

If you convert any of those pointers in the pointed to object; use . instead

struct a copyright;
copyright = *(sample->right);
// if (sample->left->num > copyright.num)
if (*(sample->left).num > copyright.num)

Since I don't see it mentioned explicitly:

  • Use -> to dereference the pointer on its left hand side and access the member on its right hand side.
  • Use. to access the member on its right hand side of the variable on its left hand side.

sample->left gives a struct a* , not a struct a , so we're dealing with pointers. So you still have to use -> .

You can, however, use sample->left->num .

. is for accessing the members of a struct (or union) eg

struct S {
int x;
}

S test;
test.x;

-> is a shorter way to write (*pointer_to_struct).struct_member

sample->left and sample->right are also pointers, so you want:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM