scanf関数を用いればデータを格納する変数のアドレスを用いてその変数にデータを格納することができます

突然ですがここでscanf関数が登場します


scanf関数については


後のエピソードで


しっかり学習することになるのですが


なぜか


ソーラー達はここにやってきました。


さあ 今日はどんなお話になるのかしら?


#include <stdio.h>


int main(void)

{

int a;

scanf("%d",&a);

printf("%d",a);

return 0;

}


(Visual Studioの場合はscanf関数は使えないので


次のプログラムのように


scanf_s関数をおつかいください)


#include <stdio.h>


int main(void)

{

int a;

scanf_s("%d",&a);

printf("%d",a);

return 0;

}


アレサ「000000010100000010010000000.....


上記のプログラムを観察してみますの。


このプログラムを実行すると


コマンドプロンプト画面にアンダーバーが表示されます。


_


👆このような感じです


ここで数値1をキーボードから入力すると


int a;


で作製されたint型の変数aに1が格納されます


そののち

printf("%d",a);

が実行されて


コマンドプロンプト画面には


1


が表示されます。


int型の変数aに


キーボードから入力したデータが格納されますので


入力するデータは整数値が望ましいといえますの。


実数値1.2345を入力したなら


int型の変数aにあわせて


実数値1.2345の小数点以下の部分は切り捨てられ


int型の変数aには1だけが格納されることになりますの。


ここで


scanf("%d",&a);


の第2引数が変数aのアドレスになっています。


(&aと表記すると


変数aのアドレスをあらわすことができます。


アドレスとはメモリにつけられた番号(16進数)のことでした)


scanf("%d",a); となっていないのですね。


ソーラーさん。



0011111111110010010000000


scanf("%d",&a);


scanf関数の命令文で


&aつまり変数aのアドレスがつかわれているということは


scanf関数は


int型の変数aのアドレス&aのメモリに宛てて数値データを格納しているんですね。


0000000011111111111」


(int型の変数aでは


int型なので4バイト分のメモリの格納領域に


aという名前がつけられています。


4バイト分のメモリの中の


1バイトのメモリごとに

4198543

4198544

4198545

4198546

のように

アドレスがついているのですが


変数aのアドレス&aとは


先頭の

4198543を用いて表されます)




ソーラー 「そうだったんだね。とても簡単なことだったね。


なんで


scanf関数をつかって変数に数値データを取り込むとき


&(アンドマーク)が出てくるのかと思ったら・・・


(正確にはアンパサンドです)


実はとっても自然な表現だったんだね。


その変数のアドレスのメモリに宛てて


入力された数値データを格納していたんだね。


それにしても・・・・


たしかに


住所がわからないと宅急便が荷物を配達できないように


アドレスが名づけられてないと


そのお部屋(この場合は変数aのお部屋)に


数値データを格納できないよね・・・」


アレサ 「00そうですね。00」


ソーラー 「突然ですが ひとまず


このプログラムを使って


実際に


int型の変数aに数値データ567866を格納してみよう。


#include <stdio.h>

int a;

int main(void)

{

scanf("%d",&a);

printf("%d",a);

return 0;

}


プログラムの実行結果

567866(と入力すると)

567866(と表示されます)


このプログラムをして


コマンドプロンプト画面から


567866を入力すると


変数aに数値データ567866が格納されます


そのあと


printf関数により


int型の変数aに格納されている数値データ567866



コマンドプロンプト画面にprintf出力表示されているというわけです。


そのとき


変数aに格納されている数値を表示するために


printf("%d",a);


がつかわれています」


アレサ 「00000111・・・


printf("%d",a);においては


scanf("%d",&a);とはまた違い


変数aのアドレスを使わずに


直接 変数aを指定して数値を%d出力していますね。」


ソーラー 「うん、


printf("%d",a);


これはこれで自然な表現だと思うな。ここは


なんか


変数aのアドレスを使わないのがぴったりな感じがするね・・・


(printf関数は基本的な関数で


天国にいけるC言語入門 シーズン1でも詳しく解説されています)


なるほど


scanf("%d",&a);


では


%d出力変換指定子が


scanf関数を使って10進数数値データを取り込む際につかわれています。


このとき10進数数値データは


10進数数値データから


0と1で表される2進数数値データへと変換して


メモリにおくりこまれています。


printf("%d",a);のときは


%d出力変換指定子は


変数aと名前をつけられたメモリ内に格納された


2進数数値データを10進数数値データへと変換してprintf出力表示する。


大活躍だね。」


アレサ 「本当 そうですね。


ところで


#include <stdio.h>

int a;/*ここです*/

int main(void)

{

scanf("%d",&a);

printf("%d",a);

return 0;

}


(Visual Studioではscanf関数はこのままでは使用できません


くわしくはscanf関数のエピソードまで


お越しください)



このプログラムのように


int a;と


main関数の前に


aのint型の変数宣言をおいても


プログラムを実行することができます



01110101010101001010101010101010................


0001010101010010101..........


ここも不思議です。


int a;は


どういう扱いになっているんでしょうか?


int a;

int main も両方とも整数値を格納する変数の型intがついています。


整数値を格納する変数の型intが並んでいるように見えます


この

int a;

int main もおなじ数値を格納するデータ型のintなのでしょうか??」


ソーラー 「


そうだね。おもしろいね。


さあ、どうかな?まあ


ヘキサ構造体であるがゆえに(笑)


これから徐々にわかってきそうだね。・・・。」


楽しみだね。」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る