55342


[参考記事](https://dixq.net/forum/viewtopic.php?t=19474)では以下のように違いについて書かれていましたが、理解できないため、ベクトルのノルムを求めるリストの疑似コードにおいてどのように書かれるのか知りたいです。

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

該当擬似コード  
構造体（ドット演算子の時）

[code]

    strut cell{
      int index;
      double value;
      struct cell* next;
    }
    
[/code]

ドット演算子

[code]

    norm <- 0
    next_address <- v
    while next_address != NULL do
        current_cell <- *(next_address)
        norm <- (ベクトルの要素を2乗したものを足していくと考えられるが、擬似コードでどのようにかいたらいいかわからない）
        next_address <- (現在のセルのポインタが指すインデックスだと考えられるが、似コードでどのようにかいたらいいかわからない)
    return sqrt(norm)
    
[/code]

アロー演算子（引用元は[過去質問のご回答](https://ja.stackoverflow.com/questions/55329/%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%8C%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AB%E3%83%8E%E3%83%AB%E3%83%A0%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/55331#55331)）

[code]

    sum <- 0.0
    while v != NULL do
        sum <- sum + v->value * v->value
        v <- v->next
    return sqrt(sum)
    
[/code]


CC BY-SA 4.0
2019-05-29T07:22:19.190
55338
2019-05-29T08:47:56.743
question
c array ポインタ
ドット演算子とアロー演算子の違いについて


`p->mem` は `(*p).mem` と同義です。って既に自分で書かれていますよね。

擬似コードでどう書けばよい？ ってことだとしょせん擬似コードですから自分（や第三者）にわかるように書けばそれでいいんです。コンパイラに通すわけでもなし。

擬似コードを実際に [c](/questions/tagged/c "'c' のタグが付いた質問を表示") コンパイラに通すのであれば
[c](/questions/tagged/c "'c' のタグが付いた質問を表示")
の文法に合うように書かざるを得ませんし、そのときはドットとアローは使い分けます。


CC BY-SA 4.0
2019-05-29T07:45:43.957
55340
2019-05-29T07:45:43.957
8589
55338
answer


> phoge->fugaと(*phoge).fugaは同じ意味です。

この通りです。

たとえば質問文中にある疑似コードを補完して次のように書いたとします。

[code]

    while next_address != NULL do
        current_cell <- *next_address
        norm <- norm + current_cell.value * current_cell.value
        next_address <- current_cell.next
    
[/code]

ここで、変数 `next_address` は `struct cell` 型の構造体を指すポインタで、変数 `current_cell` は
`struct cell` 型の構造体そのものです。この上で `current_cell` のメンバー `value` を参照する際は、ドット演算子を使って
`current_cell.value` と書きます。

ところでこの疑似コードを次のように書くこともできます。

[code]

    while next_address != NULL do
        norm <- norm + (*next_address).value * (*next_address).value
        next_address <- (*next_address).next
    
[/code]

こうするといちいち `current_cell` を定義しなくてよくなります。一方でいちいち `(*next_address)`
と書かないといけないのは面倒です。こういうときアロー演算子を使って簡単に書けます。

[code]

    while next_address != NULL do
        norm <- norm + next_address->value * next_address->value
        next_address <- next_address->next
    
[/code]

このように、アロー演算子は「ポインタの指している先の構造体のメンバー」を参照できる演算子です。この意味で

> phoge->fugaと(*phoge).fugaは同じ意味です。

ということです。

※なお、`current_cell` を消したことでデータのコピーが1回分無くなるというメリットがあります。


CC BY-SA 4.0
2019-05-29T08:47:56.743
55342
2019-05-29T08:47:56.743
19110
55338
answer