ほぷしぃ

納得C言語!

[第13回]ポインタ(解答)

(1)解答

解答プログラム

#include <stdio.h>

int main()
{
    int a[5],*p,i;
    p=a;      //pにaの先頭アドレスを代入

    char b[5],*p2;
    p2=b;     //p2にbの先頭アドレスを代入

    double c[5],*p3;
    p3=c;     //p3にcの先頭アドレスを代入

    printf("int型のアドレス\n");

    for(i=0;i<5;i++){
        //int型のときのアドレスの変化
        printf("%d\n",(p+i));
    }

    printf("\nchar型のアドレス\n");
    
    for(i=0;i<5;i++){
        //char型のときのアドレスの変化
        printf("%d\n",(p2+i));
    }

    printf("\ndouble型のアドレス\n");

    for(i=0;i<5;i++){
        //double型のときのアドレスの変化
        printf("%d\n",(p3+i));
    }
    return 0;
}

結果

変数のアドレスを出力しています

まず、それぞれのデータ型の変数とポインタの宣言をします。
int型のときはポインタもint型、char型のときはポインタもchar型となります。
次に、ポインタ変数にそれぞれの変数のアドレスを代入します。
アドレスを代入するときは変数の前に&をつけるのを忘れないでください。
アドレスを表示する場合にはpの前に何もつけないのが正解。
(p+i)としているのは、pのアドレスをiだけ進めてくださいということです。
iは0から4までなので、それぞれの型の変数のアドレス5個分が表示されますね。


(2)解答

解答プログラム

#include <stdio.h>

//プロトタイプ宣言
int add(int i,int n);
int sub(int i,int n);
int mul(int i,int n);
int div(int i,int n);
void div2(int c, int d, int *i, int *n);

int main()
{
    //変数の宣言と初期化
    int s = 0,a = 0,b = 0,c = 0;
    int *p1,*p2;

    //ポインタ変数に変数のアドレスを代入
    p1 = &a;
    p2 = &b;

    while(1){
        printf("\n簡易計算機\n");
        printf("加算=>1, 減算=>2 ,乗算=>3 ,除算=>4 ,乗除=>5 ,終了=>0\n");
        printf("\nどの計算をしますか =");
        scanf("%d",&s);
        
        //s == 0 の場合break で抜ける
        if(s == 0){
            printf("終了します\n");
            break;
        }
        
        printf("数値Aを入力してください=");
        scanf("%d",&a);
        printf("数値Bを入力してください=");
        scanf("%d",&b);

        switch(s){
            case 1:
                //入力した値a,bを関数add()に引数として渡し、返ってきた結果をcに代入
                c = add(a,b);
                printf("加算A+Bの答えは%d\n",c);
                break;
            
            case 2:
                //入力した値a,bを関数sub()に引数として渡し、返ってきた結果をcに代入
                c = sub(a,b);
                printf("減算A-Bの答えは%d\n",c);
                break;

            case 3:
                //入力した値a,bを関数mul()に引数として渡し、返ってきた結果をcに代入
                c = mul(a,b);
                printf("乗算A*Bの答えは%d\n",c);
                break;
            
            case 4:
                //入力した値a,bを関数div()に引数として渡し、返ってきた結果をcに代入
                c = div(a,b);
                printf("除算A/Bの答えは%d\n",c);
                break;

            case 5:
                //入力した値a,bとa,bのポインタを関数div2に引数として渡す
                //このとき戻り値はなく、関数内でa,bの値が書き換わる
                div2(a, b, p1, p2);
                printf("剰余A/Bは%d余り%d",a ,b);
                break;

            default:
                printf("数値が正しくありません\n");
                break;
        }
    }
    return 0;
}

int add(int i,int n)      //自作関数add
{
    int kai;
    kai = i + n;          //加算
    return kai;           //kaiを返す
}

int sub(int i,int n)      //自作関数sub
{
    int kai;
    kai = i - n;          //減算
    return kai;           //kaiを返す
}

int mul(int i,int n)      //自作関数mul
{
    int kai;
    kai = i * n;          //乗算
    return kai;           //kaiを返す
}

int div(int i,int n)      //自作関数div
{
    int kai;
    kai = i / n;          //除算
    return kai;           //kaiを返す
}

//割り算の結果と余りを計算
void div2(int c, int d, int *i, int *n){
    //*iはaのアドレスなので、c/dの結果がaに格納される
    //*nはbのアドレスなので、c%dの結果がbに格納される
    *i = c/d;
    *n = c%d;
}

結果

剰余算の計算を自作関数にしました

計算機に割り算の結果と余りの両方を求める自作関数を加えました。
このとき、戻り値は2つになってしまうので、ポインタを使いたいと思います。
自作関数の引数として、入力されたa,bの値、a,bのポインタを渡しています。
そして、自作関数div2内ではc/d、c%dの計算結果をそれぞれのポインタが指す中身(この場合a,b)に代入しています。

結果と余りを求める関数、実はグローバル変数を使ってもできますね。
暇な人はやってみてください。


[第13回]ポインタ ページのトップ [第14回]構造体