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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ascgjut

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

#1

投稿記事 by ascgjut » 3ヶ月前

コード:

#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が出てくるのでしょうか?
解説お願い致します!

box
記事: 1691
登録日時: 7年前

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

#2

投稿記事 by box » 3ヶ月前

コード:

#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Yakiniku
記事: 17
登録日時: 4ヶ月前
住所: 神奈川県

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

#3

投稿記事 by Yakiniku » 3ヶ月前

☆ポイント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引いた値です。

返信

“C言語何でも質問掲示板” へ戻る