プログラミング講座トップ ひつじTOWN デジタルシープラーニング

ひつじのC言語入門への道 第7回 scanf

■Hello world から次の1歩

printfに続いて次に目に触れる関数です。scanfは入力用関数で、普通はキーボードからの入力を意味します。printfと合わせて標準入出力関数と言われます。
#include <stdio.h>
int main(void) {
int x;

scanf(“%d”,&x);   /* キーボードからデータ(整数)を入力する */

printf(“入力された値は:%d\n”,x);

return 0;
}
Hello worldプログラムから新しい仲間が登場します。 以下の2行です。
int x;

scanf(“%d”, &x);

■型と変数

int x;
「これは変数の宣言文で、ここではint型(整数型)のxと言う変数を宣言しています。」
というような説明から入ります。

ですが、もし、変数って何?、型って何? となると、またもや、少々話がややこしくなります。ここでも、もっと後で説明するから、今日は、そういうものだと覚えてください、と逃げるでしょうね^^;

Cでは、取りあえず、そういうものだと覚えなさい、とか、おまじないだと思って覚えなさい、ということがよくありますね。

変数に対して常数というのがあります。 変数はその名のとおり、値を変えられるものです。常数は一度定義するとその値を変えることは出来ません。
例によってここでは触れませんが、例えば一口で変数といっても、後々説明したいと思いますが、次のような変数があります。
ローカル変数、グローバル変数、自動変数、外部変数、静的変数・・・

型(タイプ)はC言語では特に重要なキーワードです。 これがプログラマにとっては面倒ですね^^;これもまたいろいろあって、奥の深いものです。

■アドレス

&xをxのアドレスと言います。&はアンパサンドと読みます。
scanf(“%d”, &x);
またまた、やっかいな用語が出てきました。 いきなりアドレスですね。
その前に、これからメモリとか記憶領域という用語が出てきますが、そのイメージが沸くでしょうか?

■コンピュータの基本構成

図:コンピュータの基本装置
C言語の話からそれますが、コンピュータの基本装置です。大雑把には、処理装置、記憶装置、入出力装置ですが、細かく分けると6つの装置から構成されます。
ついでに、私達がPC等を買うときに、PCの性能を見る際には、外部記憶装置、メインメモリー、CPUをみることが多いですが、前者の2つは大きければ大きいほど、大量のデータを保管でき、より大きなプログラムを実行できます。CPUの性能はクロック数で表現されますが、クロック数が大きいほど処理速度は速いことになります。

■再びアドレス

閑話休題。
C言語でアドレスというのは図の主記憶装置の中の番地を指します。
変数名の前に&を付けると、変数の値ではなくて、その変数が蓄えられている記憶領域のアドレスを意味します。アドレスのことを番地と読んだりしますが、要するに変数に割り当てられた場所のことです。&xというのは、xという変数が蓄えられる場所を指します。

scanf関数の役割は、キーボードから入力された文字をxという変数に代入することです。
printfでは、表示したい変数名を指定すると、その変数の値が表示されました。
scanfも同様に、、
scanf(“%d”, &x);
このように&無しで書いてもいいことにして欲しいものです。

■scanfとprintfでは何故このように表現が違うのでしょうか?

一般的なテキストではこの答えは関数という章で説明されます。大体はテキストの後半以降で説明されるものが、こういう初期に既に出てきてしまいます。C言語の難しいところですね。
このように「変数の値」と「変数のアドレス」がC言語を学習し始めた直後に出てくるので、ここで多くの時間を取るわけにはいかず、ここでも、とりあえずこういうものなのだ、ということにして、さらっと流してしまうのがほとんどです。
詳細は後に触れるとして、大雑把にこの違いについて触れたいと思います。
printfとscanfの違いは、mainとの関係の違いにあります。mainとprintfとscanfは次のような関係にあります。
図:mainとprintfとscanfの関係
scanfもprintfもメインから呼び出されています。scanfとprintfの働きの違いから呼び出し方に違いがあります。
printfは、メイン関数から表示したい変数の名前を貰っています。実際には貰った時には変数名ではなくて変数の値を受け取ります。printfは単に貰った値を表示すればいいだけです。
scanfの働きは少し複雑です。キーボードから入力された値をmainに知らせないといけません。
printfはmainから情報を貰うだけなのに対して、scanfはメインに情報を知らせるという違いがあります。ここに呼び出し方の違いが出てきます。
mainが関数から情報を欲しい場合には、変数名をしらせるのではなくて、この場所に書いて欲しいという意味でxのアドレスを知らせます。scanfは、mainが知りたい情報を、貰った場所に書き込みます。
図:scanfとprintfの違い
これは関数の呼び出しの方式がこのようになっているためですが、何故そうなっているかというとさすが長くなるのでここでは省略します。
C言語は、そもそもの発端が、技術者達が自分達のために作った言語であり、そのコンパイラの都合で作られており、他のプログラマの都合はあまり考慮されていないように思います。あちこち、不親切なところがあるのはその所為かとも思います。


[←] 第6回へ | [↑] プログラミング講座トップへ | [→] 第8回へ