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なのでしょうか??」
ソーラー 「
そうだね。おもしろいね。
さあ、どうかな?まあ
ヘキサ構造体であるがゆえに(笑)
これから徐々にわかってきそうだね。・・・。」
楽しみだね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます