Thinkers'Studio
JavaとC言語の自習ツール
関数の値渡しと参照渡し(C言語版)
 関数に引数で値を渡すときの方法には、「値渡し(あたいわたし)」と「参照渡し」があります。

値渡しは ・・・

 変数や定数の値のコピーが関数に渡されます。
 そのため値渡しでは、受け取った関数でその値を書き換えても元の変数(や定数)の値は変わりません。

参照渡しは ・・・

 変数の所在(アドレス)を渡す方法です。
 そのため参照渡しでは、受け取った関数でその場所の値を書き換えることができます。

(今回のクイズです)
 次のプログラムでは、2種類の関数 multi_3( ), multi_5( ) が定義されており、main でそれらを呼び出して使います。
#include <stdio.h>

void multi_3( int *x )  // xが指す値を3倍に更新する関数
{
    *x *= 3;
}
int multi_5( int x )    // xの値を5倍にして返す関数
{
    x *= 5;
    return x;
}

main()
{
    int n = 1;

    multi_3(     );
    printf( "3倍にした値は %d\n", n );
    n = 1;
    printf( "5倍にした値は %d\n", multi_5(     ) );
}
 下線となっている部分に、引数として n を渡すにはどのように書けばよいでしょうか?
  (答えは、次回のC言語の Tips で ・・・)

前回のクイズの答え:  for文の後ろに空文があるためです。  (前回の問題を見る
空文を次の行に移して見慣れた形にすると、下のようになります。
    for( i = 0; name[i] != '\0' && name[i] != splitter; i++ )
        ;                   /* 繰り返しの度に実行される(何もしない) */
        putchar( name[i] ); /* forの後に1度だけ実行される            */
    putchar( '\n' );
うっかりセミコロンをつけたので、putchar( name[i] ) が for を抜けた後に実行される形になりました。結局 forループでは、name[i] を調べ splitter '_' の前まで i を進めるだけです。その後 name[i] を表示するので '_' が出力されます。 '_' が 3行表示されたのは、3人分の名前を処理するために printFirstName 関数が3回呼ばれたからです。

このクイズは間違えて空文を入れた例なので、セミコロン ; を取るとうまくいきます。
繰り返しの本体で空文を活用するケースもあります。基本情報技術者試験の過去問にも何度か出題されています。
    //基本情報技術者試験 平成20年春期試験 問6より抜粋
    for(i = 0; (ref_name[i] = fgetc(ifp)) != MARK; i++);