ドット演算子とアロー演算子

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マダガスカル

ドット演算子とアロー演算子

#1

投稿記事 by マダガスカル » 9ヶ月前

件名の通り、ドット演算子とアロー演算子の使い分け方がわかりません。

アローはnewしてdeleteすることで解放できるというくらいの違いは分かるのですが、それくらいしかわかりません。(まさかそれしか違いがない…?)

調べてもそれぞれの使い方ばかり出てきてそれ以上のことがわからない状態です。

アバター
みけCAT
記事: 6011
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: ドット演算子とアロー演算子

#2

投稿記事 by みけCAT » 9ヶ月前

C言語やC++の話で、オーバーロードはされていないと仮定すると、
ドット演算子は構造体やクラスに対してhoge.fugaのように使い、メンバにアクセスします。
アロー演算子は構造体やクラスを指すポインタに対してphoge->fugaのように使い、メンバにアクセスします。
phoge->fugaと(*phoge).fugaは同じ意味です。

コード:

#include <stdio.h>

typedef struct {
	int fuga;
} hoge_t;

int main(void) {
	hoge_t hoge = {42};
	hoge_t* phoge = &hoge;

	printf("%d\n", hoge.fuga);
	printf("%d\n", phoge->fuga);
	printf("%d\n", (*phoge).fuga);

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マダガスカル

Re: ドット演算子とアロー演算子

#3

投稿記事 by マダガスカル » 9ヶ月前

ポインタを指した場合何か良いのでしょうか?

軽くなったりでしょうか?

また、この場合はアロー演算子で、この場合はどっと演算子でやると良い。などわかりやすい例えってあげられませんか><;

YuO
記事: 909
登録日時: 7年前
住所: 東京都世田谷区

Re: ドット演算子とアロー演算子

#4

投稿記事 by YuO » 9ヶ月前

マダガスカル さんが書きました:また、この場合はアロー演算子で、この場合はどっと演算子でやると良い。などわかりやすい例えってあげられませんか><;
. と -> は直接置き換えられる物ではありません。

コード:

struct struct_t {
    int member;
};
という型があった場合に,
  • コード:

    struct struct_t obj;
    と宣言された変数objのメンバーmemberにアクセスしたい場合は . を使う。

    コード:

    int value = obj.member;
    obj.member = 10;
  • コード:

    struct struct_t * ptr;
    と宣言された変数ptrのメンバーmemberにアクセスしたい場合は -> を使う。

    コード:

    int value = ptr->member;
    ptr->member = 10;
間違えた場合,コンパイラがエラーを出してくれます。
オフトピック
C++における非常に特殊な例を除きます。
つまり,operator ->を定義していて,定義した型を->が返す(ポインタ)型の元となる型の両方に同じ名前のメンバーがある場合。

かずま

Re: ドット演算子とアロー演算子

#5

投稿記事 by かずま » 9ヶ月前

マダガスカル さんが書きました:ポインタを指した場合何か良いのでしょうか?
ポインタを指すのではありません。
ポインタが実体を指します。
「構造体へのポインタ」は「構造体の実体」を指します。

「構造体のメンバ」の参照方法に次の 2通りあるということです。
  • 「構造体の実体」.「構造体のメンバ」
  • 「構造体へのポインタ」->「構造体のメンバ」
ポインタを、関数の引数に使うことで、
一つの実体をコピーなしに参照でき、
メンバの変更もできて、値を返すことができます。

ポインタを使わずに、実体を関数の引数にすると、大量の
データコピーが発生し、関数内でコピーのメンバを変更しても
関数の呼出し元の実体のメンバにはそれが反映されません。

マダガスカル さんが書きました: アローはnewしてdeleteすることで解放できるというくらいの違いは分かるのですが、それくらいしかわかりません。(まさかそれしか違いがない…?)
「アロー」が解放できるのではありません。
new で実体を確保して、その実態へのポインタを取得し、
その実体へのポインタを delete することによって
実体が解放できるのです。

マダガスカル

Re: ドット演算子とアロー演算子

#6

投稿記事 by マダガスカル » 9ヶ月前

以前に単純にドットとアローでの書き方だけを変えたときにコンパイルが通ったので質問させていただきました。

ですが、今試したところ教えてくださったとおりちゃんとエラーがでました。
以前のファイルは消してしまったようで、再現も原因の究明もできませんがそれは別のところでの問題だったのだと思います。

また同じところで疑問を持ったら今度はコードも併せて質問させていただきます。

ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る