合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: マダガスカル
[URL]
Date: 2017年8月10日(木) 01:42
No: 1
(OFFLINE)

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

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

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

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

Name: みけCAT
[URL]
伝説なるハッカー(683,427 ポイント)
Date: 2017年8月10日(木) 01:58
No: 2
(ONLINE)

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

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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で殴ればいい!(死亡フラグ)

Name: マダガスカル
[URL]
Date: 2017年8月10日(木) 05:28
No: 3
(OFFLINE)

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

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

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

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

Name: YuO
[URL]
ハッカー(154,306 ポイント)
Date: 2017年8月10日(木) 09:49
No: 4
(OFFLINE)

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

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

. と -> は直接置き換えられる物ではありません。
コード[C]: 全て選択
1
2
3
struct struct_t {
    int member;
};
という型があった場合に,
  • コード[C]: 全て選択
    1
    struct struct_t obj;
    と宣言された変数objのメンバーmemberにアクセスしたい場合は . を使う。
    コード[C]: 全て選択
    1
    2
    int value = obj.member;
    obj.member = 10;
  • コード[C]: 全て選択
    1
    struct struct_t * ptr;
    と宣言された変数ptrのメンバーmemberにアクセスしたい場合は -> を使う。
    コード[C]: 全て選択
    1
    2
    int value = ptr->member;
    ptr->member = 10;
間違えた場合,コンパイラがエラーを出してくれます。
Offtopic :
C++における非常に特殊な例を除きます。
つまり,operator ->を定義していて,定義した型を->が返す(ポインタ)型の元となる型の両方に同じ名前のメンバーがある場合。

Name: かずま
[URL]
Date: 2017年8月10日(木) 12:23
No: 5
(OFFLINE)

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

マダガスカル さんが書きました:ポインタを指した場合何か良いのでしょうか?

ポインタを指すのではありません。
ポインタが実体を指します。
「構造体へのポインタ」は「構造体の実体」を指します。

「構造体のメンバ」の参照方法に次の 2通りあるということです。
  • 「構造体の実体」.「構造体のメンバ」
  • 「構造体へのポインタ」->「構造体のメンバ」

ポインタを、関数の引数に使うことで、
一つの実体をコピーなしに参照でき、
メンバの変更もできて、値を返すことができます。

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


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

「アロー」が解放できるのではありません。
new で実体を確保して、その実態へのポインタを取得し、
その実体へのポインタを delete することによって
実体が解放できるのです。

Name: マダガスカル
[URL]
Date: 2017年8月11日(金) 03:29
No: 6
(OFFLINE)

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

[解決!]

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

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

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[18人]