在数组中使用时,"."和"->"有什么区别?

What is the difference between '.' and '->' when used in array?

本文关键字:gt 区别 什么 数组      更新时间:2023-10-16

在数组中使用.->有什么区别?即:

(*foo[i]).bar

foo[i]->bar

或者:它们是一样的吗?

编辑:BTW,其他引用仅在foo.barfoo->bar之间询问。我知道其中的区别。但最近,我读到一些使用(*foo).bar的示例,而我认为它应该是foo->bar

假设foo是数组中使用的简单POD用户定义类型,那么这两条语句肯定不一样。正如你所知,以下所有内容对上述上下文都有相同的语义:

  *foo
  *(foo + 0)
  foo[0]
  0[foo]

如果你把这两个陈述换成第三种形式:

(*foo)[i].bar ==> foo[0][i].bar

foo[i]->bar ==> (*foo[i]).bar ==> foo[i][0].bar

你可以通过一个简单的测试来确认这一点:

#include <stdio.h>
#include <assert.h>
struct foo_t
{
  int bar;
};
int main()
{
    foo_t foo[2][2] = { { {0xdeadbeef}, {0xbadbeef} }, 
                        { {0xbadf00d}, {0xdecafbad} } };
    assert((*foo)[1].bar == foo[0][1].bar);
    assert(foo[1]->bar == foo[1][0].bar);
    assert(foo[1]->bar != (*foo)[1].bar);
    printf("(*foo)[1].bar: %xn", (*foo)[1].bar);
    printf("foo[1]->bar: %xn", foo[1]->bar);
}

如果它们是相同的,那么第三个断言将失败,并且输出将不是原来的样子。

没有区别。但foo[i]->bar比使用解引用算子更清晰。特别是当你有几个级别的指针最终指向和对象时,使用解引用运算符会使你的代码难以理解。

首先,数组增加了一些混乱。假设你在问之间的区别

(*x).bar;

x->bar;

对于某个类型T的实例x,那么对于指针,这两者是等价的:都取消引用指向某个类型的指针来访问成员。但是,由于在C++中,您可以重载用户定义类型的两个运算符,即operator->()operator *(),因此可能会出现这两个代码示例不等价的情况。这不应该发生在任何理智的代码中,但这是可能的。下面的代码示例说明了这一点:

#include <iostream>
struct Foo
{
  void hello() const { std::cout << "Foo!!!n"; }
};
struct Bar
{
  void hello() const { std::cout << "Bar!!!n"; }
};
struct FooBar
{
  Foo foo;
  Bar bar;
  const Foo& operator*() const { return foo; }
  const Bar* operator->() const {return &bar; }
};
int main()
{
  FooBar fb;
  fb->hello();
  (*fb).hello();
}

输出:

酒吧!!!

福!!!

1.->用于通过指向对象的指针访问对象成员变量和方法

Foo *foo = new Foo();
foo->var= 10;
foo->func();

2.用于通过对象实例访问对象成员变量和方法

Foo foo;
foo.var= 10;
foo.func();