typedef struct _Teacher {
struct _Teacher *t;
} Teacher;
int main() {
Teacher teacher1, teacher2;
Teacher *head1 = &teacher1;
Teacher *head2 = &teacher2;
printf("T1 %p\n", &teacher1);
printf("T1.t %p\n", &teacher1.t);
head1->t = head2;
printf("H1 %p\n", head1);
printf("H1.t %p\n", head1->t);
}
&teacher1 與 &teacher1.t 相同。head1 與 head1->t 不同(分別指向 teacher1 與 teacher2)。C 標準規定:結構體變量的地址等於其第一個成員的地址。teacher1 只有一個成員 t,故 &teacher1 == &teacher1.t。這類似數組名與首元素地址相同。
head1 是指針變量,其值是 &teacher1,其地址是 &head1(棧上)。head1->t 即 teacher1.t,是結構體內部的指針成員,佔用結構體內存空間。head1->t = head2 將 head2 的值(即 &teacher2)存入 teacher1.t。head1 與 head1->t 不同?head1 存儲 teacher1 的地址;head1->t 存儲 teacher2 的地址。兩個不同結構體實例的地址自然不同。
Stack:
head1 (指針變量) --> 值: 0x1000 (teacher1 地址)
head2 (指針變量) --> 值: 0x2000 (teacher2 地址)
Heap/Stack 結構體實例:
teacher1 @ 0x1000:
t (指針成員) @ 0x1000 --> 值: 0x2000 (指向 teacher2)
teacher2 @ 0x2000:
t (指針成員) @ 0x2000 --> 值: 未初始化
head1 與 head1->t 分別代表「指向結構體的指針」與「結構體內部的指針成員」,兩者值獨立。