構造体を別の関数に渡すときは、通常、Donnellが上記で提案したように実行し、代わりに参照によって渡す方が適切です。
これの非常に良い理由は、インスタンスを作成した関数に戻ったときに反映される変更を加えたい場合に、作業が簡単になることです。
これを行う最も簡単な方法の例を次に示します。
#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;
}
この例では、関数の引数はstruct-addStudent()
のインスタンスへのポインターです。では、構造体のインスタンスを作成し、参照演算子()を使用してそのインスタンスへの参照を関数に渡します。student
student *s
main()
student
addStudent()
&
このaddStudent()
関数では、矢印演算子(->
)を使用してポインターを間接参照し、そのメンバーのいずれかにアクセスできます(機能的には:と同等です(*s).age
)。
関数に加えた変更は、addStudent()
に戻るときに反映されmain()
ます。これは、ポインターが、構造体のインスタンスstudent
が格納されているメモリ内の場所への参照を提供するためです。これはprintf()
、この例では「10」を出力するで示されています。
参照を渡さなかった場合、実際には関数に渡した構造体のコピーを使用していることになります。つまりmain
、新しいバージョンを渡す方法を実装しない限り、に戻ったときに変更が反映されることはありません。それらの線に沿ってメインまたは何かに戻って構造化してください!
ポインターは最初は不快に思えるかもしれませんが、ポインターがどのように機能するのか、なぜポインターが非常に便利なのかを理解すると、ポインターが第二の性質になり、ポインターなしでどのように対処したのか疑問に思います。