- 締切済み
教えてください。
プログラミング言語論です。 C言語のプログラミングmain.cを実行した際に、(1)、(2)で表示される変数aの値それぞれを教えてください。 #include<stdio.h> void threeTimesByValue(int a){ a = 3*a; } void threeTimesByRefference(int* a){ *a=3**a; } int main(){ int a = 10; threeTimesByValue(a); printf("a=%d\n",a)//(1) threeTimesByRefference(&a); printf("*a=%d\n",a);//(2) return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- papashiroSooke
- ベストアンサー率66% (2/3)
第一回答者の方がおっしゃるように、この質問は数学ではなくて、「技術者向け。コンピューター>>プログラミング>>C,C++ というカテゴリーで質問されたほうが回答を得やすいだろうと思いますが、わたしもC言語を少しやったものなので、わかる範囲でお答えいたします。 a の値は(1)では 10、 (2)では30です。 (1)で結果を出力する前の関数 threeTimesByValue(a); に引数として渡されているのは 変数 a そのもののような感じがしますが、 値で渡される引数は元の変数のコピーが渡されるため、この関数の中で a = 3*a; としてその値を3倍しても、コピーが3倍されるだけで、元の値には変化ありません。 ちなみに、この3倍したコピーの値を関数の戻り値として return a; とするなら threeTimesByValue(a) 全体が30と言う値になりますが、ここではこの関数は戻り値を持たないように定義されています。 (2)で結果を出力する前の関数 threeTimesByRefference(&a); では 引数として変数 a へのポインター、つまり変数 a のアドレス(&a) が渡されています。そしてこの関数の中では そのアドレスにある値 *a (つまり10)を3倍して入れ替える操作が行われています。 (*a=3**a) ここで 右辺にある *a と言うのは渡されたアドレスの中身(つまり10)を意味し、それを3倍した値 3* *a (つまり30)を その新しい値として左辺に代入することを意味し、結果として左辺の *a は30になります。この2つ目の関数も戻り値はないのですが、関数の中で直接メモリー上のアドレスにアクセスしてその値を書き換えているわけです。 実際には、あなたが掲載したプログラムはコンパイルできません。それは最初の printf( ) 関数の後にセミコロンが抜けているからです。まずこれを修正してください。 また printf( ) 関数の書式指定の部分で、改行のためと思われる "\n" がありますが、この逆スラッシュ記号 "\" は全角文字になっているため改行の機能を果たさず、"\n" がそのまま出力されてしまいますので、半角文字に直してください。日本語キーボードをお使いなら、"\" になると思いますので、"\n" とすれば改行できます。 また余談ですが、あなたの開発環境がDOSプロンプトに文字を出力するような環境であれば、main( ) の最後の return 0 の前に system(pause"); を入れると、出力を表示した後、何かのキーを押すまでプログラムの終了を待ってくれるので、結果を確認できますよ。
これ数学じゃないでしょ。カテ違い。 ポインタがわかってればこんなこと質問するはずない。