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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C

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

ポインタ

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

Q&A

解決済

5回答

49526閲覧

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

ababab

総合スコア47

C

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

ポインタ

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

0グッド

3クリップ

投稿2015/07/21 07:53

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;
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

投稿2015/07/21 08:02

uasi

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2015/07/21 09:20

edo_m18

総合スコア2283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

c

1scanf("%d#,&data); 2a = &listhead; 3while(a -> next != NULL){ 4 if(a -> next -> key == data) 5 break; 6 a = a -> next; 7} 8

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

投稿2015/07/21 11:26

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2015/07/21 12:15

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

2015/07/21 12:24 編集

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

2015/07/21 13:30

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

0

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

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

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

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

投稿2015/07/21 11:22

lazy_tsan

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ababab

2015/07/21 12:25

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

2015/07/21 13:15

構造体内のメンバのアクセスは普通 st.key のように "." でアクセスしますが、構造体へのポインタの場合は (*pst).key と書くかわりに pst->key と書けるというだけのことです。 (uasiさんが書かれている内容ですね) なぜ構造体のポインタの場合だけ専用の演算子があるかというと、それは設計者のセンスの問題かと (UNIXを書くために開発した言語なので構造体のポインタをきっと多用したんでしょう)
guest

0

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

struct a{
int next;
}

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

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

投稿2015/07/21 09:55

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問