C中的这个运算符( - >)是什么?

时间:2011-07-05 16:20:57

标签: c operators

  

可能重复:
  Arrow operator (->) usage in C

据我所知,只有C ++可以使用类(obj->某些东西)但是我在很多C应用程序中看到过这个运算符。

还有一个小问题。通常使用C中的结构,如下所示:

structname.somevariable

但是我看到他们用过:

structname.something1.something2

是否与关键字union有关?

7 个答案:

答案 0 :(得分:7)

struct A
{
    int b;
};

struct A *a;

a->b  ==  (*a).b;

不,这与工会无关。它只是成为会员的一员。

答案 1 :(得分:5)

如果你有一个指向struct对象的指针,比如

 struct P * p;

您使用->

访问成员
 p->member

如果p不是指针,则使用.

访问成员
struct P p;
p.member

任何 C书都涵盖了这一点:P

答案 2 :(得分:2)

运算符->用于通过指向该结构的指针访问struct的成员。在访问嵌套结构时使用问题的第二部分,它不限于使用联合。例如:

struct A {
  int a;
};

struct B {
  struct A baz;
};

int main() 
{
  struct A foo;
  struct B bar;

  (&foo)->a = 10;

  bar.baz.a = 20;

  return 0;
}

答案 3 :(得分:0)

C ++ class es是C struct的扩展,而对象只是指向struct的指针。 C ++实际上并没有发明很多新东西;因为某种原因,它被称为C ++

struct可以嵌套。给定

struct a {
    int a_a;
    int a_b;
}

struct b {
    int b_a;
    struct a b_b;
} a;

您可以参考a.b_b.a_b

union使用与struct类似的语法,但所有成员互相重叠。当您需要以多种方式解释一块内存时,这非常有用。

我强烈建议你拿一本C书。

答案 4 :(得分:0)

当您想要访问本身是另一个结构的成员的结构的成员时,使用

x.y.z。

typedef struct _POINT
{
    int x;
    int y;
} POINT;

typedef struct _RECT
{
    POINT topLeft;
    POINT bottomRight;
} RECT;

int main()
{
    RECT r;
    r.topLeft.x = 0;
    t.topLeft.y = 0;

    int width = r.bottomRight.x - r.topLeft.x;
}

答案 5 :(得分:0)

我在C中写了一个小例子。

#include <stdio.h>
#include <stdlib.h>

struct a_t {
    int a;
    /* ... */
};

struct b_t {
    struct a_t a;
    /* ... */
};

int main()
{
    struct a_t a;
    struct a_t *b;
    b = malloc(sizeof(struct a_t));
    a.a = 1;
    b->a = 2;
    printf("%d; %d;\n", a.a, b->a); 
    (&a)->a = 3;
    (*b).a = 4;
    printf("%d; %d;\n", a.a, b->a);
    free(b);

    struct b_t c;
    c.a.a = 5;
    printf("%d;\n", c.a.a);
    return 0;
}

答案 6 :(得分:0)

如果我没记错的话,在C ++中

class IDENTIFIER {
    // stuff, possibly including functions
};

完全

相同
struct IDENTIFIER {
    private:
    // stuff, possibly including functions
};

struct IDENTIFIER {
    // stuff, possibly including functions
};

完全

相同
class IDENTIFIER {
    public:
    // stuff, possibly including functions
};