No.1ベストアンサー
- 回答日時:
scanfはaという変数のある「場所」に"%d"の型で格納すると言うものです。
一方printfではaという変数の「中身」を"%d"という型で出力すると言うものです。
つまりaと表記した場合はaの「中身」を指すことになり、&aと表記された場合はaという変数のある「場所」を指すことになります。
詳しく言うと今aという変数が10と言う場所に割り当てられているとします。そして中身には5と言う数値が入っていたとします。
この場合aのある「場所」は10となり、「中身」は5となります。
&aと書いた場合は「場所」を表すことになりますので、scanfには10が渡されて、格納したい「場所」を指定しています。10と言う場所はaに割り当てられているのでaに格納されることになります。
もしscanfでaと書いてしまった場合は、5と言う数値が渡されてしまい、本来10という場所にあるaとは無関係な5と言う場所にある何かに格納されてしまいます。
これでは思ったとおりの結果にはならないはずです。
まとめるとアドレスか、中身かといえます。
No.4
- 回答日時:
この問題はポインタを抜きにしては語れません。
C言語の設計思想は「簡単な記述で何でもできる」です。
scanfやprintfでも「一つの文でどこの場所からでも入出力可能」な設計にしてあります。
このためにはポインタ使用が必須です。
printfでは値だけが必要なので「*p」でポインタ使用が可能です。
これと等価なのは「a」ですね。
ところがscanfでポインタを使うには場所が必要なので「p」でないといけません。
これと等価なのが「&a」なのです。
と言う事で、「a」と「&a」で理解するよりも「*p」と「p」で理解しておく方が応用がきくと思います。
蛇足ですが scanf("%d",a)のような仕様にする事も出来たはずです。
しかし、これではどこの場所にでも読み込めるという機能が実現できませんので、
今のような仕様にしたのだと思います。
ありがとうございました。
私も、そういう仕様になぜしないんだろうな・・・と
疑問に思っていました。
と、いうより当時の技術じゃこれが精一杯だったのかも。ある本には「C言語は文法の出来が悪い」とか書いてあるし。。。
No.3
- 回答日時:
printfは、表示なので、値がわかればいいですが、
scanfは、格納しなければならないので、変数の値ではなく、"場所"が必要になります。
変数の"場所"(アドレス)を求めるためにアドレス演算子&をもちいて変数のアドレスを得ることができます。scanfでは、それを渡しているのです。
蛇足ですが
文字列などの場合
char str[]="String";
などの場合&を付けないで
scanf("%s",str);とする場合もありますが、
この場合は、strはアドレス定数といってもともとアドレスを表しているので付けないでよいのです。
そういう場合でも
scanf("%s",&str[0]);のようにすることもできます。
ご回答ありがとうございました。
配列の場合、配列名だけだと
先頭アドレスを表す、と参考書に書いてありました。
変数の場合、アドレスの&をつけるんですね。
こういった区別が必要、ってことがわかりました。
失礼します。
No.2
- 回答日時:
もう、ポインタは習われましたか?
関数の引数の型が、(int)型と(int *)型の様に異なっているからです。
aは変数aの値そのもの、&aは変数aが保存されているメモリ上のアドレスを表します。
関数が「値」を引数として必要としていれば(int)型で渡し、「アドレス」を要求していれば(int *)型で渡す必要があります。
printf文で表示するのは値なので「値」を渡していて、scanf文では値を入力するためのメモリ上のアドレスがわからないと困るので「アドレス」を渡しているのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
sscanfとscanfの違いがよくわからないのですが、簡単に優しく教えて下さい。 お願い致します。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Run-Time Check Failure #3とい...
-
init関数の意味
-
コンストラクタでnewを失敗した...
-
トリプルポインタが必須!とな...
-
基本アルゴリズムの『返す』の...
-
free()への引数について
-
C言語のポインタに直接アドレス...
-
ポインタについてアドバイスお...
-
C言語でのconstを返す関数
-
参照の参照、struct record **s...
-
_TCHAR、LPCWSTRについて
-
ポインタって?
-
C言語 よく使うのは?
-
IStream / VBA
-
ExcelVBAでのkernel32(64bit)
-
C言語ソースコードの解析
-
ファイルポインタのヘッダーフ...
-
c言語で任意のファイルから読み...
-
単方向リストの解釈
-
クイックソートの比較交換回数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
【C言語】戻り値が構造体の関数
-
nullポインタを逆参照とは?
-
基本アルゴリズムの『返す』の...
-
参照型で受け取った引数をポイ...
-
#define NULL ((void *)0) の弊害
-
アプリを32bitから64bit移行
-
ハンドル、アドレス、ポインタ...
-
デバイスハンドルとは?
-
C++で関数ポインタから関数名を...
-
Cで作成したDLL関数をVBから呼...
おすすめ情報