質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C

    3809questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ポインタ

    112questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C言語で「 -> 」の意味がわかりません

解決済

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 10K+

ababab

score 51

C言語のプログラムで以下のようなプログラムを見たのですが、「a -> next」の「 -> 」が何を指しているのかがわかりませんでした。
検索もしてみたのですが、"->"でヒットしてくれず困っています...

「a -> next」の場合、aとnextの関係はどのようなものなのでしょうか?
イメージがつかめません。
よろしくお願いいたします。

scanf("%d#,&data);
a = &listhead;
while(a -> next != NULL){
   if(a -> next -> key == data)
      break;
   a = a -> next;
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+3

-> は「アロー演算子」「矢印演算子」と呼ばれます。 a->next とすると、ポインタ a が指す構造体のフィールド next を読み書きできます。 (*a).next と同じ意味です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

scanf("%d#,&data);
a = &listhead;
while(a -> next != NULL){
   if(a -> next -> key == data)
      break;
   a = a -> next;
}
ほかの方が説明しているように、a->nextはポインタ(a)が指す構造体のデータ(nextあるいはkey)を使うためのものです。
また、この処理はリストを辿って読み込んだ数値と同じ値を持ったデータを探すものです。
その為に、リストの先頭をポインタ(a)に入れて順次その値を探しています。
少なくともリストには,nextとkeyという変数を持った構造体がありnextはリストに入っている次の構造体のポインタが入っています。また、リストの終端のnextにはNULLが入っています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/21 21:15

    ちなみにa->next->keyはポインタ(a)の指している構造体のnextに入っているポインタが指している構造体のkeyという変数ですd^^

    キャンセル

  • 2015/07/21 21:21 編集

    回答ありがとうございます。
    つまり、このプログラムの場合はlistheadのアドレスが差している構造体のnextという変数に入っているポインタが指す構造体にある変数keyを参照しているということでよろしいでしょうか?

    キャンセル

  • 2015/07/21 22:30

    a->next->keyの解釈はそれでよいと思いますが・・・
    “listheadのアドレス”はリストの先頭のアドレスであってポインタ(a)が同じになるのは、a = &listhead;の時だけです。あとは、nextを手繰りながら検索するのでリストの次の要素、また次の要素・・・という風にポインタの中身は変わります。
    a = a -> next; ←ここでポインタが変わります。

    キャンセル

0

意味はuasiさんがおっしゃっていることです。
自分の中のイメージを書いておくと、ローカル変数で宣言した構造体はすぐ近くのメモリ上にあるのでドット.でアクセスする。
ポインタを使った場合はヒープ領域など少し離れた場所にメモリが確保されるのでアロー(矢印)->でアクセスする。
という感じです。
(あくまでイメージです。理解の助けになれば)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

-> アロー演算子、構造体のポインタの時に使います。

struct a{
int next;
}

a.next と使いますが、 struct *A = &a; とした時
A->next

上記のソースコードの場合はlistheadのメンバーにnextがいると思います。
a = &listhead;
となっておりますので、 listhead.next と a->next は同じ場所を参照しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

オーソドックスなリスト構造でデータを検索しているプログラムですね。

listhead は多分、
struct list {
  int key;
  struct list *next;
};
とか定義されてるんでしょう。

「リスト構造」でググれば情報は見つかると思いますよ。

しかし、例のプログラムだと listhead.key はチェックしませんね。
それでいいんだろうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/21 21:25

    回答ありがとうございます。
    「->」で指されている変数(a,next,key)はすべて「*」や「&」のようなアドレス・ポインタなのでしょうか?

    キャンセル

  • 2015/07/21 22:15

    構造体内のメンバのアクセスは普通 st.key のように "." でアクセスしますが、構造体へのポインタの場合は (*pst).key と書くかわりに pst->key と書けるというだけのことです。
    (uasiさんが書かれている内容ですね)

    なぜ構造体のポインタの場合だけ専用の演算子があるかというと、それは設計者のセンスの問題かと
    (UNIXを書くために開発した言語なので構造体のポインタをきっと多用したんでしょう)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    検索表をPHPを使って作りたい

    こんにちは。 CSVを読み込んで、検索表を自動生成したいです。 「検索表」とはどういうものか、と言うと、 1:口元に髭がある・・・・・・2へ1:口元に髭がない・・・・・・3へ2

  • 解決済

    GsonでJSONのオブジェクト型をJavaの配列型としてデシリアライズしたい

    GsonでJSONのオブジェクト型をJavaの配列型としてデシリアライズしたいのですが、このようなことは出来るのでしょうか? 具体的な例として以下の様なJSON文字列があった際に

  • 解決済

    エクセルのセルに入っている数字とその座標を出力するマクロ(VBA)

    シート上の指定したセルのアドレスを(1,A)→(1,1),(1,B)→(1,2)...というふうに (列番号,行番号) の形にし、さらにセルに入っている数字をその後に付け足して(列

  • 解決済

    プログラミング超初心者の質問です。

    問題の解答例がいまいちよくわかりません。問題は「"a"のあとの3文字以内に"z"がある文字列のものをtrueと返すメソッドを書け」です。 解答例の自分なりの解釈をコードの横に#で

  • 解決済

    特殊文字のif文

    会員登録時に特殊文字の入力チェックをしたいです。 PHPで、 case 'SPECIAL_CHARCTER' if($value == ''){ //仮   $arrErr[$k

  • 受付中

    学生追加の連結リスト

    大学の問題で 「add関数の内容を実装し、連結リストに学生が追加でき るようにせよ 以下の順番で3パターンの実装を行うこと ▪ パターン1:テンプレートの状態(最初に3名登録されて

  • 解決済

    Excel VBA のinternetexplorer.applicationオブジェクトを使用して...

    たとえば以下の様なhtmlがあり "class2"のdiv内のspan内の値(d,e,f)を順に取得するには どのようにすればいいのでしょうか? <body> ~

  • 解決済

    ノードによるリスト構造

     質問 「名前と誕生日」のデータベースを作ります.  ユーザが,順番に名前(string型)と誕生日(int型8桁:1998年1月5日なら19980105)を入力します. その後,

同じタグがついた質問を見る

  • C

    3809questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ポインタ

    112questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。