第8回:関数(3)

先週に引き続き関数を取り上げます.


先週の演習のこたえ

よく使う関数を用意しておこう.

1.二つの整数を渡すと,大きい方を答える関数
2.整数の2乗を計算する関数
3.整数の3乗を計算する関数
4.整数のn乗を計算する関数

main関数の部分はこんな感じ.あとは,関数の定義部分を作ってみよう.

#include <stdio.h>

int large(int a, int b)
{
    if(a>b){
        return a;
    }else{
        return b;
    }
}

int square(int a)
{
    return a*a;
}

int cube(int a)
{
    return a*a*a;
}

int power(int a, int n)
{
    int i, pow=1;
	
    if(a==0){
        return 0;
    }else{
        for(i=0; i<n; i++){
            pow *= a;
        }
            return pow;
    }
}

void main()
{
    int a, b, n;

    printf("aの値を入力してください:");
    scanf("%d", &a);
    printf("bの値を入力してください:");
    scanf("%d", &b);
    printf("n乗のnの値を入力してください:");
    scanf("%d", &n);  

    printf("大きい数の値は%d\n", large(a, b));
    printf("aの2乗は%d\n", square(a));
    printf("bの3乗は%d\n", cube(b));
    printf("aの%d乗は%d\n", n, power(a, n));

    printf("a^3 + b^2 + a^n =%d", cube(a) + square(b) + power(a,n));
}


これまでは,一つの値しか関数から戻すことができなかった.また,同じ変数名を使っていても,関数の方で値を変えても,mainでは変化しなかった.これは,関数には変数の中身が伝えられているためです.

次に,関数から複数の値を戻したい場合や,文字列や配列データを渡したい場合を考えよう.この場合,関数に変数のしまってある場所を伝え,その場所のデータを関数で使うようにすれば,よいと考えられる.


アドレス参照(Call by reference)

変数のしまってある場所(アドレス)を扱うのは,ポインタの出番です.

ポインタを用いて,変数の場所を関数に渡したプログラムの例です.

#include <stdio.h>

int test2(int *a)        /* 変数aのアドレスを受け取る(ポインタ変数) */
{
    *a += 10;             /*aの指すアドレスの中身に1を加えるから,main関数でも変化する */

    return *a;
}

void main()
{
    int a, b;

    printf("aの値を入力してください:");
    scanf("%d", &a);

    b = test2(&a);        /* 変数aのアドレスを関数に渡す */

    printf("aの値は%d\nbの値は%d\n", a,