プロが教えるわが家の防犯対策術!

教えてください。

scanf ("%d",&intnger[i]);

についての説明として、

配列[]使うから&がいる。
配列intnger のみの場合は&を使わない。

と学びましたが、
よく分かりません。

A 回答 (1件)

どこで、誰から聞きました?


その説明では、わたしでも分らないかも。


scanf は、
・標準入力から
・書式文字列で指定した内容に沿った文字列を読み込んで
・書式に設定された値に変換し
・対応するポインタを示す先に書き込む
関数です。

%d は、整数の文字列を読み込んでintに変換し、 intへのポインタが示す領域に書き込むものです。

int a;
scanf ("%d",a); /* × : a は int であって ポインタではない */
  /* 正確には、読み込んだ値が変数aに入ることはめったに無いし、エラーが出るかもしれないけど出ないかもしれない */
scanf ("%d",&a); /* ○ : &を付けることで、aへのポインタを求める */



scanf ("%d",&intnger[i]);

の場合、配列intngerに[i]を付けた「intnger[i] 」は int型変数と同じ扱いになります。
つまり、上記の変数a と同じで、&を付けて 「intnger[i] へのポインタ」を求める必要があります。

ここで「(多くの場面で) 配列名だけ使うと、先頭要素へのポインタになる」というルールを使います。
このとき
&intnger[i] == (intnger + i )
ですから、
scanf ("%d",intnger+i);
と書けます。

ここで、i=0を考えると
scanf ("%d",&intnger[0]);

scanf ("%d",intnger+0);
とは同じになるし、ポインタ+0 == ポインタ ですから
scanf ("%d",intnger);
も同じになります。


ただ、私なら、 scanf ("%d",intnger);
と書くと、配列全体に複数の値を読み込んでいるように見えるので、
scanf ("%d",&intnger[0]);
と書いて、意図をはっきりさせます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!