こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

構造体を引数で関数へ渡す

こんばんは。現在C言語を学んでいます。
課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。

分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。
私の考えている動作プロットとしては

1. 構造体の形式を定義する。
2. 冒頭にて存在する関数を定義
3. main関数内にて構造体に名前を付けて定義し、値を入力より受付
4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。
5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず)

関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように)

また呼び出される関数側の括弧は何を記述するのでしょうか?
いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。

読みづらく、分かりにくいものかとは思いますが
どうぞ宜しくご教授頂ければと思っております。
構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。

//----------------------------------------------------------------//
//構造体HOGEHOGE定義
//----------------------------------------------------------------//
typedef struct tagHOGEHOGE {
int a,b;
int c;
}HOGEHOGE;

void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明

//----------------------------------------------------------------//
// main
//----------------------------------------------------------------//
void main(){
HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義
scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入
scanf("%d",&hoge.c);//数値をhoge.cへ

do_it_hoge();//←ここが分からず

}

//----------------------------------------------------------------//
// do_it_hoge 関数。構造体を引数で受け取りたい関数。
//----------------------------------------------------------------//
void do_it_hoge(){ // ←括弧内の受け方が分からず

// ここでmainで入力された &hoge.aなどを参照して表示したい
// 例: printf("hogeA:%d",&hoge.a);

}
//----------------------------------------------------------------//

投稿日時 - 2009-10-11 00:48:39

QNo.5357793

困ってます

質問者が選んだベストアンサー

普通、アドレス渡しでなんとかするかと。こんな感じ:

#include <stdio.h>
typedef struct { int a,b; char *m; } Hoge_t;

void do_it_hoge( Hoge_t *h ){
printf( "Hoge: %d %d '%s'\n", h->a, h->b, h->m );
}

int main( int c, char *v[] ){
Hoge_t hoge = { 1,2, "hoge hoge" };
do_it_hoge( &hoge );
}

ここらへん基本なので、入門書とか読み直してみては。

投稿日時 - 2009-10-11 01:28:27

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>#4さん
>値渡しとアドレス渡しの二種類の方法があります。

いわゆる「アドレス渡し」は結局のところ
「アドレス」という「値」を渡しています。

C言語における引数の渡し方には「値渡し」だけが存在し、
いわゆる「アドレス渡し」は「値渡し」の一部であると考えるのがよいでしょう。

投稿日時 - 2009-10-13 21:22:03

ANo.4

値渡しとアドレス渡しの二種類の方法があります。

http://www9.plala.or.jp/sgwr-t/c/sec15-4.html
が丁寧に説明されていると思うので、参考にしてください。

~上記URLより引用

【値渡し】
引数の独立性が保たれ安全なプログラムになりますが、
対象となる構造体の内容をすべてコピーするため、大きな構造体では
無駄な時間が多くなります。
【アドレス渡し】
構造体をコピーすることなく、構造体のアドレスを引数で渡すため、
サイズの大きな構造体を渡すときには値渡しより効率的です。

投稿日時 - 2009-10-11 10:36:14

ANo.3

全然難しくないですよ。
int a;
とやればint型のaが宣言できるのと同じで、
HOGEHOGE a;
とやれば、HOGEHOGE型のaが宣言できます。
ですから、それを引数に取る関数の宣言は

void fugafuga(HOGEHOGE a)
{

で、それを呼ぶには

HOGEHOGE a;
fugafuga(a);

です。

投稿日時 - 2009-10-11 03:08:23

ANo.2

>// ここでmainで入力された &hoge.aなどを参照して表示したい

このコメントが間違いのもとです。
mainで入力したのは、hogeのメンバーa, b, cです。
これらのメンバーのアドレスを入力したのではありません。

do_it_hoge関数の中でhogeのメンバーを参照するだけなら、
何もhogeのアドレスを渡す必要はありません。hogeそのものを渡せばじゅうぶんです。
戻り値のないdo_it_hoge関数の中で、hogeのメンバーの中身を変更するのであれば、
do_it_hoge(&hoge);
のようにhogeのアドレスを渡す必要があります。

投稿日時 - 2009-10-11 01:37:28

あなたにオススメの質問