これまで、C言語のプログラムで、printf関数とscanf関数は、何度も使用してきた。
printf関数による表示とは異なり、scanf関数による読み込みでは、実引数として与える変数名の前に&を付ける必要がある。
今回は、「scanf関数とポインタを確認するプログラム」で、printf関数への依頼と、scanf関数への依頼の違いを確認してみよう。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.89.1)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
scanf関数とポインタを確認するプログラム
//scanf関数とポインタを確認するプログラム
#include <stdio.h>
int main(void)
{
int i;
puts("整数を入力してください。");
printf("整数i:"); scanf("%d",&i);
printf("iのアドレス:%p\n",&i);
printf("整数は%dです。\n",i);
return 0;
}
実行結果
整数を入力してください。
整数i:15
iのアドレス:0x7ffca0c4c634
整数は15です。
printf関数に渡すのは出力すべき値である。→「整数は15です。」と出力される。
「634番地に格納されている変数iに読み込んだ整数を格納してください。」
scanf関数に渡すのは、入力された値の格納先変数へのポインタである。
scanf関数は、呼出し側の関数が用意したオブジェクトに値を格納しなければならないため、変数の「値」をもらっても意味がない。ポインタを受け取ることで、そのポインタが指すオブジェクトに対して、キーボードから読み込んだ値を格納する。
scanf関数を呼び出す側では、scanf関数に
このアドレスに格納されているオブジェクトに読み込んだ値を入れてください。
と依頼している。
このため、アドレス演算子&を変数に適用した上で渡す必要がある。
(参考)新・解きながら学ぶC言語 第2版 柴田望洋 (監修・著)、 由梨かおる(著)SBクリエイティブ
コメント