• ベストアンサー

配列とポインタの違いについて

書籍などで配列とポインタの違いについて勉強していますが、未だによくわかりません。 C言語における配列とポインタの違いについて教えて頂けますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.5

配列とポインタを厳密に説明するのはかなり面倒ですが、違いがよく分からないとのことなので、「違う部分」をいくつか上げますね。(動作検証はVisual C++ 2008 Express Edition) char ary[10]; char *ptr; で、変数を作ります。そして、 ary[0] = 'a'; ptr[0] = 'a'; 2行目はおそらく実行時エラーです。なぜなら、ポインター変数は単にポインターの入れ物なので、初期値は不定ですし、指す先も不正な領域で使用できないでしょう。しかし、 ptr = ary; こうすると、ptrはaryの先頭要素を指すようになり、ptr[0]もary[0]も同じ値になります。一方、 ptr = ptr + 1; /* OK */ ary = ary + 1; /* エラー */ です。なぜならaryはあくまでも配列であり、ポインターではないため、ポインタ値の変更はできません。Cの配列は式の中でのみ先頭要素のポインターとして評価されます。また、 char **pp = &ptr; /* OK */ char **pp2 = &ary; /* 警告(型の互換性) */ char(*pa)[10] = &ary; /* OK */ です。アドレス演算子(&)で使用される場合などで、配列は配列そのものとして扱われます。そして、配列は型に要素数を持ちます。 あとは、規格書にもっと細かいことが書いてあるはずです。(私のこれは参考URLを参考にして書きました。規格書が手元にないので……)

参考URL:
http://kmaebashi.com/programmer/pointer.html
masy0312
質問者

お礼

非常にわかりやすい説明ありがとうございます。 なんとか納得できました。

その他の回答 (5)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

本質的にまったく違うものです。 ただ、式中に配列名が現れた場合、暗黙のうちにポインタに変換されます(一部例外を除く)ので、そういった誤解の元になっています。

masy0312
質問者

お礼

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

noname#29459
noname#29459
回答No.4

配列とは、値をいれるケースが、いくつかつづいたもの。 char a[MAX_T]; とは、aは、charをいれるケースが、MAX_T個つづく(配列)。a は、また、その先頭アドレスを意味する定数。この宣言によって、配列の領域が確保される。 ポインタとは、なにかしら、値が入っている場所を指し示すもの。 char *b; bは、charがはいっているケースのアドレスを保持する変数。 b = a; bに、aの値をいれる。 char **c; cは、char *をさすポインタ。だから、 c は、 char * 型をさしている。したがって、そのポインタをたぐれば、先には、char が入っている。

masy0312
質問者

お礼

ご回答ありがとうございます。 理解できました。

  • snowize
  • ベストアンサー率27% (68/245)
回答No.3

簡単に説明するのもいいですが、どちらかというと自信を持って説明できるくらいの知識を身につけてもらいたい箇所なので、柴田望洋さんのポインタ関係の著書をお薦めいたします。類書の中では最も理解しやすいかと存じます。 だいぶ昔なので自信がありませんが、恐らく『秘伝C言語問答 ポインタ編』で間違いないと思います(長すぎて参考URL載せられませんでした)。ポインタと配列の違いについても丁寧に説明されていましたし、「ポインタのポインタ」なんていう「?」な用語にも分かりやすい説明をつけてくれてあります。

masy0312
質問者

お礼

ご紹介にございました書籍をさっそく参考にさせて頂いております。 ありがとうございました。

  • g_liar
  • ベストアンサー率52% (382/728)
回答No.2

配列やポインタは、メモリとの関係がわかると一気に理解が進むのですけどねぇ…。 配列は、実体。 ポインタは、実体を指し示すものです。 以下のページが参考にならないかなぁ? http://www9.plala.or.jp/sgwr-t/c/sec10-3.html

masy0312
質問者

お礼

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

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

質問者さんはどのように理解していますか? ご自分の言葉で、配列とポインタの違いを説明してみてください。 それに対して、合っている、あるいは間違っているということを指摘した方が、適切な回答になるかと思います。

masy0312
質問者

お礼

配列とは、指定した型のサイズで値を格納するための複数の箱を メモリに連続して確保したものであり、 ポインタとは、ある型のオブジェクトが存在するメモリのアドレスを 値としてもつもの、という解釈です。 わかりにくい説明で申し訳ございません。。。

関連するQ&A

専門家に質問してみよう