1. 指针的本质:从门牌号理解内存访问
指针是C语言中最强大也最容易让人困惑的特性之一。我第一次接触指针时,导师用了一个精妙的比喻:"指针就像门牌号,而变量就是住在房子里的人"。这个比喻让我茅塞顿开——指针存储的不是数据本身,而是数据在内存中的地址。
1.1 内存布局的直观理解
想象一条长长的街道,每个房子都有唯一的门牌号。在计算机中:
- 内存就是这条街道
- 每个字节就是一个房子
- 内存地址就是门牌号
- 变量就是住在房子里的人
当我们声明一个普通变量时:
c复制int age = 25;
相当于:
- 在街道上找个空房子(分配内存)
- 给房子挂上门牌号(如0x7ffeeb0d1234)
- 让一个叫"age"的人住进去,他带着值25
1.2 指针变量的特殊之处
指针变量自己也住在某个房子里,但它携带的不是普通值,而是其他房子的门牌号:
c复制int *p_age = &age;
这里:
&age获取age的门牌号p_age这个指针人记下了这个门牌号*p_age表示"去p_age记录的门牌号找那个人"
关键理解:指针是二级间接访问。普通变量直接存储值,指针变量存储"哪里可以找到值"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针的核心操作:寻址与解引用
2.1 取地址操作符(&)
&符号就像社区管理员,能告诉你任何变量的住址:
c复制int score = 90;
printf("score住在: %p\n", (void*)&score);
输出可能是:score住在: 0x7ffeeb0d5678
2.2 解引用操作符(*)
*符号是快递员,能根据地址把包裹(数据)送到正确位置:
c复制int *p_score = &score;
*p_score = 95; // 把95送到p_score记录的地址
printf("现在score是: %d\n", score); // 输出95
2.3 指针的算术运算
指针加减不是简单的数值运算,而是按所指向类型的大小移动:
c复制int arr[3] = {10,20,30};
int *p = arr;
printf("%d\n", *p); // 10
p++;
