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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
init関数の意味
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
型変換について
-
fopne で失敗する原因
-
main(int argc,char **argv[])...
-
bsearch関数の呼び出しで
-
ExcelVBAでのkernel32(64bit)
-
参照型の変数をポインタ引数を...
-
Run-Time Check Failure #3とい...
-
NULLポインタが0でない処理系と...
-
デバイスハンドルとは?
-
LPSTR型の初期化について
-
【C言語】戻り値が構造体の関数
-
参照型で受け取った引数をポイ...
-
C言語の関数と配列に関する質問
-
エラーの意味
-
関数ポインタの利点
-
ポインタを使うことのメリット...
-
C++で関数ポインタから関数名を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
Cで作成したDLL関数をVBから呼...
-
C言語でのconstを返す関数
-
NULLとブランクの違い
-
エラーの意味
-
DLL<->VB間での受け渡し(文字...
-
ハンドル、アドレス、ポインタ...
-
【C言語】戻り値が構造体の関数
おすすめ情報