- ベストアンサー
C言語 ポインタと配列の違いが理解できません。
ポインタと配列の違いとは何でしょうか? 自分は学校で習ったのですがあまり深くはやってくれず良く理解していないままです。 ・ポインタと配列はしまう場所は同じなのでしょうか? ・単にしまい方、呼び出し方が違うだけなのでしょうか? ・ポインタと使えるところでは配列も使えるのでしょうか? ・そもそもしまわれる場所って何処なのでしょうか? 基礎中の基礎のことなので申し訳ないですが教えてください。 後、「」←このサイト見ろ だけのような解答は無しでお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
基本的な説明は、ポインタとは、アドレスのことで、配列は、ある変数の要素のあつまりを意味します。 Ex) 文字列100バイトの変数(str)があります。 ● 配列 char str[100]; charの要素のデータが100個連続して領域を確保した。 実際は、100バイトの領域が確保されている。 100バイトの領域 ● ポインタ char *str; charの要素で扱う領域の先頭ポインタの変数をstrとして定義した。 実際は、文字列の先頭アドレスを格納さる領域が確保されている。 32bitマシンでは4バイトの領域 ポインタと配列はしまう場所は同じなのでしょうか? A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。 Ex) 文字列100バイトの変数(str)があります。 このstrに文字をセットする場合は、下記の方法があります。 char str[100]; 配列 char *strp; ポインタ ●配列の場合 str[0] = 'A'; 配列strの0番目に'A'をセット str[1] = 'B'; str[2] = 'C'; ●ポインタの場合 memcpy(str, "ABC", 3); ☆ memcpyの引数1の属性はポインタです。 配列の名称を引数に指定した場合は、自動的にポインタ扱いです。 又は *strp = (char *)str; strp = 'A' strpが指すポインタに'A'をセット (strp+1)= 'B' strpが指すポインタ+1に'A'をセット (strp+2) = 'C' 上記のプログミングで、最終結果は同じとなります。 単にしまい方、呼び出し方が違うだけなのでしょうか? A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。 ポインタと使えるところでは配列も使えるのでしょうか? A.基本的には、正解です。 但し、プログラミングの内容によっては、異なります。 そもそもしまわれる場所って何処なのでしょうか? A.『その領域にセットされる値』と考えて大丈夫です。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
> ポインタと配列の違いとは何でしょうか? あまりにも違いすぎて、比較すること自体がばかげています。 例えていうなら、「住所」と「町」ぐらい違います。
- D-Matsu
- ベストアンサー率45% (1080/2394)
ポインタと配列はソースコード上の記述では交換可能なケースも多いですが、全くの別物です。 ポインタはレーザーポインタのように「指すもの」ということで、では何を指すのかと言えば「確保済みのメモリ」です。 従って、ポインタは宣言しただけでは使用できず何かしらのメモリ領域情報を与えてやらなければなりません。 このとき未確保のメモリを指すことが出来ないかと言えば出来る訳ですが、その中身へアクセスしようとした瞬間にまともなOSならアプリケーションエラーを発生させます。 一方の配列は「要素の集合体を整列してアクセス可能にしたもの」であって、宣言と同時に必要な量のメモリが確保されます。 ですから、 int a[10]; a[0] = 0; と int *a; a[0] = 0; では、コンパイルはどちらも通りますが後者の書き方で作成したプログラムはこの箇所でアプリケーションエラーになります。
- vipasigaru
- ベストアンサー率38% (16/42)
・ポインタと配列はしまう場所は同じなのでしょうか? どういう意味で? ポインタは、変数のアドレスを指す変数、です。 単独では、「変数として使用することはできません。」(という理解でいてください) 必ず、他の変数が実体としてある時に、セットで使用するものです。 配列は、変数を複数個、いっぺんに扱うための仕組みです。 場所はどちらも、メモリ上です。 ・単にしまい方、呼び出し方が違うだけなのでしょうか? いろいろ違います。 ・ポインタと使えるところでは配列も使えるのでしょうか? 使えません。 ・そもそもしまわれる場所って何処なのでしょうか? しまわれる場所って何ですか? 一応、表面的な使い方だけ。 普通の変数 int v; 配列 int a[10]; ポインタ int *p; p = &v; // ポインタにv をセットする a = &v; // 配列にvはセットできない p = &a[0]; // ポインタに配列の先頭番地を割り当てる p = a; // これも可能。ポインタに配列の番地を割り当てる a[2] = 10; // 配列として扱う p[2] = 10; // ポインタでも、配列のようにアクセスは可能だが・・・ p = &v; p[2] = 10; // これもできてしまうため、注意が必要 p = a; p++; // こうすると、pはa[1]の番地がセットされる a++; // これはできない
- okbakabaka
- ベストアンサー率30% (22/73)
配列は変数を多次元に扱えるようにした物 ポインタはデータのある場所のアドレス まったく別物。