ページ 11

至急解答お願い致します。

Posted: 2018年1月30日(火) 00:14
by ascgjut

コード:

#include <studio.h>
int func(int a,int *p);

int main(void){
int s=132, a, b;
b=func(s,&a);
printf(“%d¥n”,b);
printf(“%d¥n”,a);
return 0;
}

int func (int a,int *q){
*q=a+5;
return (*q)+25;
}
このプログラムで最初に表示されるのが162、2番目に表示されるのが137になるようなんですが、どうして162と137が出てくるのでしょうか?
解説お願い致します!

Re: 至急解答お願い致します。

Posted: 2018年1月30日(火) 02:08
by box

コード:

#if 0
インクルードすべきファイル名が間違っています。studio(これじゃスタジオ)
ではなくて、stdio(標準入出力standard input/output)です。
また、変なところに全角のダブルクォーテーションがあるのもいただけません。
あと、インデント(字下げ)ってご存じですか?今のようなノッペリしたコードは、
あまり読む気になれません。メリハリを付けましょう。

p.s.
あまり「至急」って書かない方がいいと思う。ていうか、投稿のタイトルは、
中身がある程度わかるものにしていただきたいような気がしないでもない。
#endif

#include <stdio.h>

int func(int a, int *p);

int main(void)
{
    // sは132で初期化しているが、aとbの中身はこの時点では不定(要するにゴミ)
    int s = 132, a, b;

    // 変数aのアドレスを渡しているのは、その場所の中身を書き換えたいな~という意図
    b = func(s, &a);
    printf("%d\n", b);      // func関数から戻ってきた値(戻り値)を出力
    printf("%d\n", a);      // func関数で中身を書き換えたaの値を出力
    return 0;
}

int func(int a, int *q)
{
    // main関数から受け取った132という値に5を足した結果(137)を、
    // 変数qが指している場所に格納
    *q = a + 5;
    // 137に25を加えた162という値を、main関数へ戻す
    return *q + 25;
}

Re: 至急解答お願い致します。

Posted: 2018年2月03日(土) 21:08
by Yakiniku
☆ポイント1、関数の引数によって、値を変更する権利の有無は選べます

関数内の引数に渡す時は実数かポインタか選ぶことが出来ます。
たとえば、void func(int *a);のように
int a=5;
func(&a);
で変数aのアドレス(&a)を渡した場合、関数func内で変数aの値を自由に操作することができます。

しかし、void func(int a);のように
int a=5;
func(a);
なら関数func内で変数aの値を自由に操作することはできません。
これはそういう書き方だと覚えてもらうしかないと思います。

☆ポイント2、a=*b+5という式があったとして、変更されるのは変数aであってポインタ*bではありません。
return *q + 25;
も同じこと。*q は戻り値から25引いた値です。