掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25628

構造体をやりとりする関数
投稿者---tou(2006/01/22 16:41:02)


#include <stdio.h>

struct person {
    int no;
    char name[40];
    int age;
};

void dataout(struct person pen);

int main(void)
{
    struct person a, pen;
    
    dataout(a);
    printf("no=%d name=%s age=%d", a.no, a.name, a.age);
    
    return 0;
}
void dataout(struct person pen)
{
    
    printf("no >");scanf("%d", &pen.no);
    printf("name > ");scanf("%s", pen.name);
    printf("age > ");scanf("%d", &pen.age);
    
    
}



現在この問題に取り組んでいるのですが、コンパイラを使って試してみても副関数で入力したデータがmain関数の方に反映されません。
関数間のデータのやり取りがうまくいっていないのは想像できるのですが、本で調べてみてもどう構成すればいいのかが理解できません。

差し出がましいお願いなのは分かっているのですが、関数のデータのやりとりについて解説をお願いできないでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体をやりとりする関数 25631 tou 2006/01/22 16:50:26
<子記事> Re:構造体をやりとりする関数 25632 KING・王 2006/01/22 16:53:11


No.25631

Re:構造体をやりとりする関数
投稿者---tou(2006/01/22 16:50:26)


すみません忘れていました。
環境はXP、コマンドプロンプトです。


この投稿にコメントする

削除パスワード

No.25632

Re:構造体をやりとりする関数
投稿者---KING・王(2006/01/22 16:53:11)


main()関数内の変数aと、dataout()関数内のpenは別物です。

関数の引数は、関数を呼び出した際に、引数として渡した変数のコピーが関数に渡されます。
そのため、dataout()のpenは関数を呼び出した際のaのコピーでしかありません。
そして、関数の中でpenの中の値を変更しても、所詮aのコピーの値を変更しているだけのため、
元のaには影響がありません。

#例えるなら、ある本があり、関数を呼んだときに、その本のコピーを渡す。
#そして、関数の中でその本のコピーにいくら落書きしても、
#元の本に落書きされるわけではない、ということです。

でもって、このような場合呼び出し元で、変数(ここではa)のアドレスを関数に渡します。
そうすると関数内ではそのアドレスをもとに、もとのaの値をそのまま変更することができます。

#上記例に例えるなら、呼び出し元では、本がおいてあるのがどの本棚の何段目のどの位置の本であるかが書いてある紙のコピーを渡す。
#関数内では、コピーに書かれている内容をもとに、呼び出しもとが指定した本そのものがわかるので、
#もとの本に対して落書きをすることができると。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧