8

重複の可能性:
C でのアロー演算子 (->) の使用法

「。」の違いを理解しようとしています。C 言語でのデータ アクセスの "->" スタイル。例えば。

struct div{
    int quo;
    int rem;
};

1) 「->」の使用

struct div *d = malloc(sizeof(struct div));
d->quo = 8/3;
d->rem = 8%3;
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d->quo,d->rem);

2) 「.」の使用

struct div d;
d.quo = 8/3;
d.rem = 8%3;
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d.quo,d.rem);

どちらの場合も同じ出力が得られます。

答え: 商 = 2 剰余 = 2

これら 2 つのアプローチは内部でどのように機能していますか? また、どのタイミングで使用する必要がありますか?インターネットで検索してみましたが、あまり役に立ちませんでした。関連するリンクも歓迎します。

また、メモリ内のストレージに違いはありますか?

4

7 に答える 7

24

基本的な違いは次のとおりです。

. is the member of a structure
-> is the member of a POINTED TO structure

そのため.、構造内の変数への直接アクセスがある場合に使用されます。ただし、->構造体へのポインターを介して構造体の変数にアクセスするときに使用されます。

struct があるとしますa:

struct a{
    int b;
}

しかし、言うcはへのポインタであり、次のaことがわかりますc = (*a)。その結果->、 の特定のケースの代替として使用されてい.ます。したがって、 を実行する代わりに を(*a).b実行できますがc->b、これはまったく同じです。

于 2012-12-30T00:40:08.947 に答える
11

->の観点から定義されています.

つまり、 anda->bと同等(*a).bであるため、明らかに同じ結果が得られます。

->便宜上存在します。

于 2012-12-30T00:40:54.947 に答える
3

C では、->と非常に似て.いますが、ポインタを扱います。構造体では、.は構造体内のメンバーを直接参照するために使用され、 は構造体->へのポイントのメンバーを参照するために使用されます。状況に応じて、ポインターを使用するかどうかに関係なく、ほぼ同じ結果が得られます。

a -> bと同じです(*a).b

のように考えてくださいa = a + 1。シンプルさと利便性のために、a++を使用してまったく同じ結果を達成します。

于 2012-12-30T02:43:04.490 に答える
3

構造体へのポインタを扱う場合は->を使用し、直接使用する場合は を使用します.

于 2012-12-30T00:40:23.697 に答える
3

作成されたオブジェクトの有効期間を手動で管理する必要がある場合は、最初の方法を使用してください。作成されたオブジェクトの有効期間が、作成されたスコープまたはそれを含むオブジェクトのスコープに制限されている場合は、2 番目の方法を使用します。

于 2012-12-30T00:41:38.207 に答える
2

簡単に言えば、同じ結果が得られると予想されます。メモリ割り当てを変更し、構造体からデータにアクセスする方法を変更します。理解したいことに関する良いリンクのいくつかは、動的メモリ割り当てに関するチュートリアルC++ での動的メモリの操作 です

于 2012-12-30T00:50:23.083 に答える
2

いつが使用されている場合、メンバーへの構造体と呼ばれます。

->を使用すると、メンバーへのポインターと呼ばれます。

ただし、メンバーへのポインターが使用されている場合は、このように解決できます..

x -> y と (*x).y はどちらも同じ..

于 2012-12-30T03:10:02.250 に答える