構造体を関数Aにアドレスで渡します。 このとき関数Aの受け取る側はポインタで受け取ると思います。 関数Aの中で構造体のメンバに値を代入したいときは「&」つけて「->」でメンバを参照すると思います。

構造体を関数Aにアドレスで渡します。 このとき関数Aの受け取る側はポインタで受け取ると思います。 関数Aの中で構造体のメンバに値を代入したいときは「&」つけて「->」でメンバを参照すると思います。 上記と同じ状況で「&」をつけなくて良いパターンってあるのでしょうか?

C言語関連275閲覧

ベストアンサー

このベストアンサーは投票で選ばれました

0

>rick54545さん ポインタで構造体渡しの関数内で&は付けません。 サンプルプログラム作りました。 --- ex202.c #include <stdio.h> typedef struct { int a; int b; } test; void addone( test *c ) { ++(c->a); } int main(int argc, char *argv[]) { test t; t.a=1; t.b=1; addone(&t); printf("t.a=%d\n",t.a); return 0; } --- 動作したときのアウトプット t.a=2 と言うことで関数内でポインタ渡ししたら c->a で &c->aではありません。 値渡しのときは"->"のかわりに"."です。 &はポインタ渡しの関数を呼び出すときに必要になります。 上の例だと addone(&t); です。 よろしくお願い致します。

その他の回答(3件)

2

struct st{ int a; }; void func(struct st* param); だったとしたら param->a /* こっちが普通 */ または (*param).a /* *paramはポインタが指している実体 */ でメンバにアクセス。 逆に&がつくパターンってのはちょっと思いつきません。&が付いたら関数側で確保した変数へのポインタが得られるだけですから。

2人がナイス!しています

2

buynnnmmm1さんのご指摘の通り c = func (&a); ・ ・ int func (int &a) とはコーディングしませんよね。 aが構造体であっても意味は同じです。 今大半のcの処理系はc++と互換を保っています。 旧来のcでは不可能だった構造体の引数渡し、関数値(return値)として構造体の実態を使う事も許されています。 「参照」の機能を勉強して下さい。ポインターの誤用を防ぐために「参照」はとても便利な機能です。

2人がナイス!しています

2

質問に回答いたします。参考になれば幸いです。 結論から言うと、構造体のポインタをパラメータとして受け取った関数Aの中では&は不要です。 struct data{ unsigned int num; } main(){ struct data; func_a(&data); } func_a(*data){ data->num = 0; return; } この様に関数Aの中で構造体のポインタから変数へのアクセスは可能かと思います。

2人がナイス!しています