通過一個完整示例,直觀展示變量、一級指針、二級指針的地址與值關係,消除指針理解難點。
int main(void) {
int a = 5;
int *p = &a;
int **p1 = &p;
printf("a 地址: %p\n", &a);
printf("p 值: %p, p 地址: %p\n", p, &p);
printf("p1 值: %p, p1 地址: %p\n", p1, &p1);
printf("a 值: %d\n", a);
printf("經 p 訪問: %d\n", *p);
printf("經 p1 訪問: %d\n", **p1);
return 0;
}
a 地址: 0x7fffd57a181c p 值: 0x7fffd57a181c, p 地址: 0x7fffd57a1808 p1 值: 0x7fffd57a1808, p1 地址: 0x7fffd57a1810 a 值: 5 經 p 訪問: 5 經 p1 訪問: 5
a 存儲值 5,地址 &a = 0x7fffd57a181cp = &a → 存儲 a 的地址*p → 解引用得 a 的值 5&p → p 自身的地址 0x7fffd57a1808p1 = &p → 存儲 p 的地址*p1 → 解引用得 p 的值(即 a 的地址)**p1 → 雙重解引用得 a 的值 5&p1 → p1 自身的地址 0x7fffd57a1810*:沿著地址找到目標值p1 → &p → p → &a → ap(地址值)與 *p(目標值)**p1 是直接操作 p1 的值,實際是 *(*p1)