11.構造体

11-12. 構造体そのものを引き渡し

◇構造体そのものを引き渡し

前回のプログラムを改造してみました。ちなみに、構造体の宣言はmain()内でなく、グローバル領域に移しています。それはoutput()のプロトタイプ宣言で構造体st_sampが宣言されているためでもあります(^^;;;

#include<stdio.h>

struct st_samp{
    int x;
    int y;
    int z;
};

int output(struct st_samp s2);

main()
{

    struct st_samp s1={2,3,0};

    s1.z = output(s1);

    printf("%d * %d = %d\n",s1.x,s1.y,s1.z);
    return;
}

int output(struct st_samp s2)
{
        s2.z = s2.x * s2.y;
        return s2.z;
}

/* 結果
2 * 3 = 6
*/

結果は前回と同じです。

main() output()
s1 s2
┌────┐ ┌────┐
│s1.x ├──→│s1.x │
├────┤ ├────┤
│s1.y ├──→│s2.y │
├────┤ ├────┤
│s1.z ├──→│s2.z │
└────┘ └─┬──┘
↑ │s2.z = s2.x * s2.y
└───────┘
return s2.z

メモリブロックではこのようになります。
構造体ごと引き渡す利点は、引数が単純に記述できプログラムが見やすくなりますが、構造体が大きくなるにつれて、無駄なオーバーヘッドやメモリ消費を招きます。