構造体を別の関数に渡すときは、通常Donnellが上記のようにして、代わりに参照渡しする方がよいでしょう。
非常に良い理由は、インスタンスを作成した関数に戻ったときに反映される変更を加えたい場合は、それが簡単になるということです。ここ
これを行う最も簡単な方法の例である: - student *s
この例で
#include <stdio.h>
typedef struct student {
int age;
} student;
void addStudent(student *s) {
/* Here we can use the arrow operator (->) to dereference
the pointer and access any of it's members: */
s->age = 10;
}
int main(void) {
student aStudent = {0}; /* create an instance of the student struct */
addStudent(&aStudent); /* pass a pointer to the instance */
printf("%d", aStudent.age);
return 0;
}
、addStudent()
関数の引数は、student
構造体のインスタンスへのポインタです。main()
では、student
構造体のインスタンスを作成し、その参照を参照演算子(&
)を使用してaddStudent()
関数に渡します。
addStudent()
関数では、矢印演算子(->
)を使用してポインタを逆参照し、そのメンバーにアクセスすることができます(機能的には(*s).age
に相当)。
我々はmain()
に戻ったときにポインタが私たちのメモリにstudent
構造体のインスタンスが格納されている場所への参照を与えたので、我々はaddStudent()
機能に加えた変更が反映されます。これはprintf()
で示され、この例では「10」が出力されます。
参照を渡さなかった場合は、関数に渡した構造体のコピーを実際に使用しています。つまり、渡し方を実装していない限り、main
に戻るときに変更が反映されません新しいバージョンの構造体をmainまたはその行に沿って何かに戻します!
ポインタが最初に外れているように見えるかもしれませんが、いったん動作していることを頭に浮かべれば、とても便利な理由で第二の性質になります。
ここで構造体を宣言していますか?あなたの実際の実装ファイルでは、 'struct student {/ * ... * /};' code?それは間違ったスコープにあるようです(あなたの 'main'関数で宣言されているか、' addStudent'を呼び出そうとしている関数のように)... –
ええ、それは私の関数スコープです –