引数と戻り値


引数と仮引数

これまで、一部の標準関数を使用してきました
その全ては、必ず括弧 ( ) の中に何らかの値を指定していたはずです
printf()関数では、文字列を画面に表示させるのに文字列定数を指定したりしていましたね

このように、関数に対して何らかの情報を渡すことができます
こうすることによって、動的にデータを処理できる実用的な関数を実現できますね

関数に渡される情報のことを引数と呼びます
今まで何度か使ってきた言葉ですね。私たちはこれまで何度も標準関数などで引数を渡してきました
C言語の基礎で抽象的に引数と戻り値の関係を説明していましたが
ここからはより具体的に、実例を見ながらその使い方を覚えていきましょう

引数を呼び出し元から受け取るには、渡された値を保存する変数が必要です
引数リストで引数を受け取るための特別な変数を仮引数と呼びます

戻り値の型 関数名(型 変数名 , ...);

赤い部分が仮引数の宣言部分です
引数には任意の数の引数を指定することができ、ANSI C標準では最低で31以上受け取れなければならないとされています
#include <stdio.h>

void func ( int list );

int main() {
        int list;
        printf("関数に渡す値を入力してください>");
        scanf("%d",&list);
        func(list);             /*変数listが関数に渡される*/

        return 0;
}

void func( int list )
{
        printf("渡された値は%dです" , list );
}
おや!?と思った方、鋭い考察です
このプログラムの中では int list がプロトタイプとmain()関数の中の2ヶ所で宣言されています
じつはmain()関数の list という変数と func() 関数の list という変数はまったく別物として扱われます
関数の中と外の変数については、後ほど詳しく説明します

さて、main()関数内の func(list) でscanf()関数によって入力された値がfunc()関数に渡されます
func()関数は1つまでの整数型引数を受け取ることができます
渡された値は func( int list ) で宣言されているように、func()関数内だけでlistという変数名で扱えます

受け取る値のデータ型は変数がint型である以上整数でなければなりませんが
型変換は通常の変数同士の代入と同じです
#include <stdio.h>

void func ( char list);

int main() {
        int list;
        printf("関数に渡す値を入力してください>");
        scanf("%d",&list);
        func(list);             /*変数listが関数に渡される*/

        return 0;
}

void func( char list ) {
        printf("渡された値は%dです" , list );
}
このプログラムは、main()関数から渡す引数のデータ型はintなのに対して
仮引数はchar型です。そのため上位8ビット以降は切り捨てられます
さらに、このプログラムでmain()とfunc()関数内のlistという変数が、まったくの別物であることも確認できたはずです

引数には任意の数を指定できるといいました
実際に複数の型による複数の引数から値を関数に渡してみましょう
#include <stdio.h>

void func( char str[], int var);

int main() {
        func("kitty on your lap" , 9);
        return 0;
}

void func( char str[], int var) {
        printf("%s" , str + var);
}
この関数は渡された文字列を文字型配列の仮引数に、第二引数は数値としています
第一引数で渡された文字列を第二引数で渡された値を添え字として、その要素から出力します


値を呼び出し元に返す

関数には戻り値というのもありますね
今までは void でとおしてきた部分です

戻り値は何らかの値を呼び出し元に返すことができます
これを利用して、関数の実行結果などを呼び出し元で受け取り制御することができます
値を返すには、関数の中で return ステートメントを使用します
これまでも、私たちはOSに対してmain()関数が終了すると return で 0 という値を返していました
もちろん関数の設定で戻り値の型を目的に合わせれば、整数以外を返すこともできます
#include <stdio.h>

char* func(void);

int main() {
        char *str;
        str = func();

        printf("%s",str);

        return 0;
}

char* func() {
        return "kitty on your lap";
}
もっともこの場合はfunc()関数は何もせずにただ文字列(のポインタ)を返すという意味のない事をやっています
まぁ、場合によってはこのように、整数以外も返せるということです

つぎに、引数から与えられた数値を加算してその結果を戻り値として返す関数を作成してみましょう
#include <stdio.h>

int func(int var1 , int var2);

int main() {
        int var;
        var = func(13 , 17);

        printf("戻ってきた値 = %d" , var);

        return 0;
}

int func(int var1 , int  var2 ) {
        return var1 + var2;
}



前のページへ戻る次のページへ