こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語 プログラム問題

 すいません、C言語初心者です。以下のプログラムがわからないので、よければ教えてください。

#include<stdio.h>
int f(int a);
int g(int *a);
main(){
int i, j, na =10;
int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("a = ");
for (i=0; i<na; i++); printf("%d ",a[i]);
j = f(a[2]);
j = f(a[3]);
j = g(a+4);
j = g(a+5);
printf("\na = ");
for (i=0;i<na;i++) printf("%d ",a[i]);
printf("\nj = %d\n",j);
}

int f(int a) {
static int total=0;
total = total + a;
a = a+50r;
return total;
}

int g(int *a) {
static int total=0;
total = total+(*a);
(*a) = (*a) +50;
return total;
}

<結果>
a = 1 2 3 4 5 6 7 8 9 10
a = 1 2 3 4 55 66 7 8 9 10
j = 11

 


 まず、結果がなぜ下の段に55 56があるのか、そして関数f,gの機能、最後にj=11の意味です。j=5+6 =11とは聞きましたがどこから出ているのかがわかりません。
 よろしくお願いします。

投稿日時 - 2009-02-08 19:18:24

QNo.4700348

困ってます

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

この問題の趣旨は値渡しと参照渡しの違いを説いているんでしょうね。
for文のあとの;はいりません。要確認
<結果>は
a = 1 2 3 4 5 6 7 8 9 10
a = 1 2 3 4 55 56 7 8 9 10
j = 11 になります。    要確認

コメント入れといたので参考にしてください。

#include<stdio.h>
int f(int a);
int g(int *a);
main(){
int i, j, na =10;
int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("a = ");
for (i=0; i<na; i++) printf("%d ",a[i]);
j = f(a[2]);
j = f(a[3]);
j = g(a+4);       //配列aの先頭から+4つまり、a[4]=5
j = g(a+5);       //配列aの先頭から+5つまり、a[5]=6
printf("\na = ");
for (i=0;i<na;i++) printf("%d ",a[i]);
printf("\nj = %d\n",j);
}

int f(int a) {
static int total=0;
total = total + a;
a = a+50;
return total;
}

int g(int *a) {    //g(a+4)の時*a=5,g(a+5)の時*a=6
static int total=0;
total = total+(*a);   //g(a+4)の時total=5,g(a+5)の時total=11
(*a) = (*a) +50;    //g(a+4)のとき*a=55つまり、a[4]=55
return total;   //g(a+5)のとき*a=56つまり、a[5]=56
}    //よってa[12]=1,2,3,4,55,56,7,8,9,10,11,12}
   //になっている。
<結果>
a = 1 2 3 4 5 6 7 8 9 10
a = 1 2 3 4 55 56 7 8 9 10
j = 11

投稿日時 - 2009-02-08 21:08:36

ANo.1

ポインタ渡しと、値渡しの、場合の、動きの違いを試みているプログラムの様ですね。

実行結果が、なぜそのようになるのかは、
変数の内容について、トレースしてみると、わかるはずです。

投稿日時 - 2009-02-08 19:30:37