首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言指針與結構體內部指針地址差異深度解析

     編輯:程式設計綜合問答

代碼回顧

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)。

核心解釋

1. 結構體變量地址 = 其第一個成員地址

C 標準規定:結構體變量的地址等於其第一個成員的地址。teacher1 只有一個成員 t,故 &teacher1 == &teacher1.t。這類似數組名與首元素地址相同。

2. 指針變量本身有地址,也存儲地址值

  • head1 是指針變量,其值是 &teacher1,其地址是 &head1(棧上)。
  • head1->t 即 teacher1.t,是結構體內部的指針成員,佔用結構體內存空間。
  • 賦值 head1->t = head2 將 head2 的值(即 &teacher2)存入 teacher1.t。

3. 為什麼 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 --> 值: 未初始化

關鍵結論

  • 結構體地址 = 首成員地址(前提:無填充字節,第一個成員偏移為 0)。
  • 指針成員是獨立的存儲單元,可指向任意同類型對象。
  • head1 與 head1->t 分別代表「指向結構體的指針」與「結構體內部的指針成員」,兩者值獨立。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved