私はCの構造体について学んでいます。構造体を引数として別の関数に渡すとき、正確には何をしているのでしょうか。すべてのメンバー値を別の関数にコピーしていますか?引数として配列を渡すときは、配列の最初のアドレスであるarray[0]を渡します。構造的にはそれほど単純ではないようです。私の推測では、値をコピーしたり、アドレスを渡したりすることはありません。必要に応じて、渡される構造体のメンバーのアドレスを使用できるようにコンパイラーに指示しています。よくわかりませんが..助けていただければ幸いです。
質問する
198 次
4 に答える
1
構造は、値と参照の両方で渡すことができます。大きな構造体がある場合は、参照によって渡すことをお勧めします。そうでない場合、渡された構造体のコピーが呼び出された関数で作成されるため、大量のスタックスペースが消費される可能性があります。これを読んで、構造体の受け渡しについて詳しく知る
于 2012-05-03T14:04:09.757 に答える
1
それはどのようにstruct
渡されるかに依存します:
- 値が渡された場合、コピーが作成され、関数内で行われた変更は
struct
呼び出し元には表示されません。 - 参照によって渡された場合、コピーは作成されず、関数内で行われた変更は
struct
呼び出し元に表示されます
例えば:
#include <stdio.h>
struct X {
int value;
};
void pass_by_value(struct X a_x)
{
a_x.value = 10;
printf("by_value(address=%p, value=%d)\n", &a_x, a_x.value);
}
void pass_by_ref(struct X* a_x)
{
a_x->value = 20;
printf("by_ref(address=%p, value=%d)\n", a_x, a_x->value);
}
int main()
{
struct X my_x = { 1 };
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_value(my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
pass_by_ref(&my_x);
printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);
return 0;
}
出力:
my_x(address = 0013FF74、value = 1) by_value(address = 0013FF78、value = 10) my_x(address = 0013FF74、value = 1) by_ref(アドレス= 0013FF74、値= 20) my_x(アドレス= 0013FF74、値= 20)
于 2012-05-03T14:06:51.510 に答える
1
#include <stdio.h>
struct foo {
int a;
}
void by_value(struct foo x) {
x.a = 10;
}
void by_reference(struct foo* x) {
x->a = 10;
}
int main(int argc, char* argv[]) {
struct foo v;
v.a = 5;
by_value(v);
printf("%d\n", v.a);
by_reference(&v);
printf("%d\n", v.a);
return 0;
}
あなたがそれをコンパイルして実行するならば、これはあなたの質問に答えるはずです。
于 2012-05-03T14:13:31.807 に答える
0
関数を呼び出す前に、コンパイラーは最初にパラメーターをスタックにプッシュし、次に関数を呼び出します。したがって、関数はスタックからパラメーターを取得できます。
アドレスによって渡されると、アドレスは関数に渡されます。また、コンパイラは、パフォーマンスを向上させるために、「メモリアライメント」などと呼ばれるパラメータメモリも処理します。したがって、関数では、そのメモリブロックを構造体に簡単に変換できます。
値が渡されると、コンパイラはパラメータを処理し、処理されたパラメータアドレスを関数に渡します。
ちなみに、1つのプロセスでメモリアドレスは同じです。どの機能でも使用できます。
于 2012-05-03T14:18:06.317 に答える