int a;とすると、int型の大きさでメモリのどこかに変数aが確保されます。 入力関数の場合、入力されたデータを変数の中に実際に入れてやらなくては いけません。そのためには、aが実際にいる(?)住所を教えてやら なくてはいけません。変数aの住所(アドレス)を&aで表します。 さて、&aを値として持つ変数pを考えると
p = &a;と言うものが考えられます。このときpをポインタと言います。 また、pのデータ型を宣言するときは、
int *p;とすればいいのです。どうです、あっさりした説明でしょう。 (え、よくわからない?ポインタについては、あとで詳しい解説 を書くので今は、雰囲気だけでOKです)
では、実際にscanfを使ったプログラムを書いてみましょう。 ex01.cを次のように書き換えてください。
#include <stdio.h> #include <conio.h> int main() { int a, b; printf("a,bを入力してください。\n"); scanf("%d %d",&a, &b); printf("a = %d b = %d\n", a, b); printf("a + b = %d\n", a + b); printf("何かキーを押してください\n"); getch(); printf("End"); return 0; }これを、ビルドして実行すると
さて、12や18と入力の度にリターン・キーを押さずに
一度に「12 18」と入力したらどうでしょうか?
(12と18の間に半角スペースを入れる)
答えは、最初のやり方と同じ結果になります。
また、自分でプログラムを作ったのでaやbは、int型だとわかりますが
全くの赤の他人がこのプログラムを実行して、とんでもない大きな
整数を入力したり、文字列を入力したらどうなるでしょうか。
実験してみてください。いろいろやってみるとこのプログラムの
まずい点がわかってくると思います。
#include <stdio.h> #include <conio.h> int main() { int a, b; int *p, *q; p = &a; q = &b; printf("a,bを入力してください。\n"); scanf("%d %d",p, q); printf("a = %d b = %d\n", *p, *q); printf("a + b = %d\n", *p + *q); printf("何かキーを押してください\n"); getch(); printf("End"); return 0; }これでも、全く同じプログラムができます。&aや&bを使わずに ポインタp,qを使っていることに注目してください。 また、a,bのかわりに、*p,*qを使っていることにも注意して ください。
Update Oct/14/1996 By Y.Kumei