一回も披露したことのない豆知識

C言語で以下のように引数に値を渡す場合とポインタを渡す場合では、
どんなメリットデメリットはあるのでしょうか?
普段はポインタばかり渡していたので、値を渡す経験がなく疑問に思いました。
構造体を値で渡す良い点はありますか?

struct sample {
int a;
int b;
};

void test1(struct sample sa){}

void test2(struct sample *sa){}

A 回答 (4件)

ナカミを壊される心配がありません。

    • good
    • 0

今回の例の構造体は小さいからあまりでメリットになりませんが


サイズの大きな構造体だと、値で渡すと関数の呼び出しのオーバーヘッドが大きくなります。

struct sample {
int i;
char string[1024];
double x[1000];
};

これを値で渡していたら・・・。
    • good
    • 0

おっと失礼。



ポインタで渡す場合のデメリット
test2関数で変更した内容によって、test2関数を呼び出している側において本来内容を変えてほしくない領域が不用意に書き換わる
    • good
    • 0

値で渡す場合のメリット


test1関数でいくら内容を変更しても、test1関数を呼び出している側での構造体の内容を不用意に壊すことがない

値で渡す場合のデメリット
test1関数でいくら内容を変更しても、test1関数を呼び出している側に
変更内容を伝えられない

ポインタで渡す場合のメリット
test2関数で変更した内容が、test2関数を呼び出している側に的確に伝わる

ポインタで渡す場合のデメリット
test2関数で変更した内容によって、test2関数において本来内容を変えてほしくない領域が不用意に書き換わる


メリットとデメリットは上記のように裏返しです。
プログラムを書く側の責任で、状況に応じて使い分けることが肝要でありましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!