-7

配列で使用する場合.と使用する場合の違いは何ですか? ->あれは:

(*foo[i]).bar

foo[i]->bar

または:彼らはちょうど同じですか。

編集:ところで、他の参照は と の間foo.barでのみ尋ねられfoo->barました。そして、私は違いを知っています。(*foo).barしかし最近、あるべきだと思ったときに使用するサンプルを読んでいますfoo->bar

4

4 に答える 4

9

が配列で使用される単純な POD ユーザー定義型であると仮定するfooと、これら 2 つのステートメントは確かに同じではありません。ご存知かもしれませんが、上記のコンテキストでは、以下はすべて同じ意味を持ちます。

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

2 つのステートメントを 3 番目の形式に置き換えると、次のようになります。

(*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: %x\n", (*foo)[1].bar);
    printf("foo[1]->bar: %x\n", foo[1]->bar);
}

それらが同じである場合、3 番目のアサーションは失敗し、出力はそれとは異なります。

于 2013-07-04T10:14:32.210 に答える
3

違いはありません。しかしfoo[i]->bar、間接参照演算子を使用するよりも明確です。特に、オブジェクトを指すことになるいくつかのレベルのポインターがある場合、逆参照演算子を使用すると、コードが理解しにくくなります。

于 2013-07-04T05:05:10.120 に答える
1

1.-> オブジェクトへのポインターを介してオブジェクトのメンバー変数とメソッドにアクセスするため

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

2.. オブジェクトインスタンスを介してオブジェクトメンバー変数とメソッドにアクセスするため

Foo foo;
foo.var= 10;
foo.func();
于 2013-07-04T05:07:00.060 に答える