構造体へのポインタを理解するのに苦労しているので、いくつかのprint文でサンプルコードを書きました。構造体メンバが構造体へのポインタで更新されない
struct Student {
uint32_t id;
uint8_t marks[8];
int32_t credit;
};
struct Student jacob;
struct Student *adam = &jacob;
struct Student mary = *adam;
mary.marks[3] = 80;
jacob.marks[3] = 75;
adam->marks[3] = 67;
printf("jacob: %d\n", jacob);
printf("&jacob: %d\n", &jacob);
printf("adam: %d\n", adam);
printf("*adam: %d\n", *adam);
printf("mary: %d\n", mary);
printf("mary.marks[3]: %d\n", mary.marks[3]);
出力は次のようになります。
jacob: 4195856
&jacob: -436012784
adam: -436012784
*adam: 4195856
mary: 4195856
mary.marks[3]: 80
なぜmary.marks[3]
80の値がありますか?私が理解するところでは、がjacob
のアドレスを指しているので、mary
は間接的にstruct jacob
を指しています。したがって、adam->marks[3] = 67
の行は、同じ場所を指しているので、mary.marks[3]
の値を変更します。
mary.marks[3]
の値が同じままである理由を理解してもらえますか?
"maryは間接的に指しています"。それは事実ではない。 'mary'はポインタではありません。 'mary'は' adam'が指しているもののコピー*を含んでいます。 – kaylum
あなたは 'jacob'の内容を初期化していないので、あなたがコピーするもの(' mary'に '* adam'を割り当てる時)は未定義です。アドレスを正しく印刷する必要があります。 'printf()'(または '* adam'、または 'mary')に' jacob'を渡すべきではありません。 –
p.s.将来の参考として、コンパイルできる完全な例を提供する必要があります。特に、 'main()'がありません。 –