11.構造体

11-11. 構造体と関数

◇構造体と関数

 まず、構造体と関数の連携について説明します。
構造体を関数に引数として渡すにはどうしたらよいでしょう。
一番簡単に思いつくのは構造体そのものを渡す場合と、メンバのみ渡す場合が考えられます。そして厄介にも構造体へのポインタを渡したり、戻り値がポインタの場合も考えられます。

◇メンバの引数渡し

 これは、実際タダの変数を渡しているのと同じなので別に難しいことはありません。また、呼び出される関数側は構造体を意識しなくても良いという利点があります。ただし、引数の記述が長くなり見づらくなるのが難点です。

サンプルプログラム

#include<stdio.h>

void output(int num,char *p_str);

main()
{
struct st_samp{
int i_num;
char *p_name;
};

struct st_samp s1={1,"Text-A"};

output(s1.i_num, s1.p_name);
return;
}

void output(int num, char *p_str)
{
printf("%2d, %s\n", num, p_str);
}

結果:
1, Text-A

メモリーでは・・・
s1 output()のnum
+———+ Copy +——-+
s1.i_num | 1 |———————->| 1 |
+———+ +——–+ +——-+
s1.*p_name| |—–>| |output()の*p_str
+———+ Copy +——–+
v |
+———+ |
| Text-A |<——-+
+———+

このようになります。

◇関数からの戻り値をメンバに格納

この前は、関数への引渡しだけでしたが、今度は関数からの戻り値をメンバに格納してみます。

2つのメンバの積を求める構造体プログラム

#include<stdio.h>

int output(int men1, int men2);

main()
{
    struct st_samp{
        int x;
        int y;
        int z;
    };

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

    s1.z = output(s1.x, s1.y);

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

int output(int men1, int men2)
{
    int multi;
    multi = men1*men2;
    return multi;
}

/* 結果 
2 * 3 = 6
*/

s1 output()
┌─────┐ ┌────────┐
│s1.x │───→│ men1 │
├─────┤ │ │
│s1.y │───→│ men2 │
├─────┤ │ multi=men1*men2│
│s1.z │←───│ return multi │
└─────┘ └────────┘