• 締切済み

教えてください。

プログラミング言語論です。 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; }

みんなの回答

回答No.2

第一回答者の方がおっしゃるように、この質問は数学ではなくて、「技術者向け。コンピューター>>プログラミング>>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"); を入れると、出力を表示した後、何かのキーを押すまでプログラムの終了を待ってくれるので、結果を確認できますよ。  

全文を見る
すると、全ての回答が全文表示されます。
noname#152422
noname#152422
回答No.1

これ数学じゃないでしょ。カテ違い。 ポインタがわかってればこんなこと質問するはずない。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • Visual C++ 2008 Express Edition

    Visual C++ 2008 Express Editionをダウンロードしたのですが、使い方が全く分かりません。C言語を学習しています。 例えば #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } というようなプログラミングを実行するにはどうすればいいでしょうか

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • 一番最初でつまずいてます!!

    Borland C++Compilerをインストールしてプログラミングの勉強をし始めたばかりです。 #include<stdio.h> int main(void) { printf("はじめてのC言語プログラム"); return 0; } と入力してコンパイルすると 「インクルードファイル'stdio.h'をオープンできない」 というエラーがでました。 何度も見直したし、環境変数も合わせてるのになぜでしょうか!?

  • フリーソフト

    プログラミングができる日本語のフリーソフトがあれば 教えてください。C言語のプログラムで #include<stdio.h> int main(void) { printf("%d",15+12); return(0); } 簡単なヤツだとこんな感じのプログラムです。

  • 現在、C言語を習っています。

    現在、C言語を習っています。 今、関数を勉強しているんですがわからない文があるので正解の文を教えてください。 #include <stdio.h> int main (void) { int a=123; doubke b=4.5; printf("%d\n○○" ,a,b); return 0; } ○に入る言語や文が間違っていたら教えてください。

  • グローバル変数について

    ◎1--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; glb=30; printf("main a=%d glb=%d\n",a,glb); func(); return 0; } void func(void) { int b=88; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎1の実行結果----------------------- main a=20 glb=30 func b=88 glb=30 ------------------------------------- ◎2--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; func(); printf("main a=%d glb=%d\n",a,glb); return 0; } void func(void) { int b=88; int glb=30; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎2の実行結果----------------------- func b=88 glb=30 main a=20 glb=0 ------------------------------------- 以上2つのプログラムで、◎1は参考書を参考に作成したものです。 ◎1のプログラムで、グローバル変数glbの値をmain( )関数内で設定していたので、次に◎2のようにfunc( )という関数プロトタイプ内で、グローバル変数glbの値を設定し、main( )関数内のprintf文でも表示させようと思ったら、「glb=0」となってしまいました。 なぜこのようになってしまうか、教えてもらえたら嬉しいです。

  • ASCIIコード入力

    プログラムを作っていてどうしてもわからなくなりまして… #include <stdio.h> int main(void) { char c; c=38; printf("%c\n",c); return 0; } この場合は&が出てくるからいいんですけど… #include <stdio.h> int main(void) { char c; scanf("%c",&c); printf("%c\n",c); return 0; } この場合は97をscanすると9が出てきます。ASCIIコード入力でaを表示させたいんですが、何が間違っているのでしょうか? 初心者なもので…お願いしますm(__)m

  • c言語なのですが

    c言語なのですが #include<stdio.h> main() { int a; printf("整数を5回足し算する\n"); scanf("%d %d",&a); printf("a*5=%d\n",a*5); return(0); } でエラーが起こります どこを修正すればいいのでしょうか

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );