一次简单的指针练习让我抓狂
发布: (2026年1月31日 GMT+8 05:31)
3 min read
原文: Dev.to
Source: Dev.to

我被要求手动写出给定指针练习的输出。看起来很简单,但当我进行到某个阶段时,我发现自己迷失了。越是思考,越是陷入一团混乱。向 AI 求助也没有帮助。
下面是让我卡住的例子、我犯的错误、错误原因以及我从这次经历中学到的原理。
Code
int f(int** r, int** s) {
int temp = r;
int temp2 = **s;
int *z = *r;
*r = *s;
*s = z;
printf("r = %d\n", r);
printf("s = %d\n", **s);
*z += 3;
**s -= 8;
**r -= 19;
return temp + temp2;
}
int main(void) {
int a = 80;
int b = 12;
int *p = &a;
int *q = &b;
int x = f(&p, &q);
printf("x = %d\n", x);
printf("*p = %d\n", *p);
printf("*q = %d\n", *q);
printf("a = %d\n", a);
printf("b = %d\n", b);
return EXIT_SUCCESS;
}
Expected Output
r = 12
s = 80
x = 92
*p = -7
*q = 75
a = 75
b = -7
Mistakes I Made
-
返回值错误 – 我返回了
64而不是92。
在第 5 行和第 6 行,temp和temp2分别被初始化为r(一个指针)和**s(整数12)。我错误地认为后面对**r和**s的算术操作会影响temp和temp2。实际上,这两个变量是独立的副本;要修改它们必须直接操作temp和temp2(例如temp += 3)。 -
改动了错误的地址 – 我在
main中改变了*p和*q所指向的内容,而不是在f中改变*r和*s所指向的内容。交换应该影响传入函数的指针,而不是原始变量。 -
误解了
*z– 我把*z当作地址,认为*z += 3意味着“把指针向后移动三个位置”。实际上,*z是一个int(z所指向的值),所以*z += 3是把该整数加 3,而不是修改地址。
这些误解让我原地打转。
Takeaways
- 回归基础 – 重新阅读指针的入门教材。
- 逐步写出每一步 – 即使是看似平凡的操作也可能隐藏细微的细节。
- 记住类型 – 清楚自己正在处理的是指针、指向指针的指针,还是实际的数值,这一点至关重要。
- 可视化内存地址 – 绘制内存布局有助于避免把数值和地址混淆。