一次简单的指针练习让我抓狂

发布: (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

  1. 返回值错误 – 我返回了 64 而不是 92
    在第 5 行和第 6 行,temptemp2 分别被初始化为 r(一个指针)和 **s(整数 12)。我错误地认为后面对 **r**s 的算术操作会影响 temptemp2。实际上,这两个变量是独立的副本;要修改它们必须直接操作 temptemp2(例如 temp += 3)。

  2. 改动了错误的地址 – 我在 main 中改变了 *p*q 所指向的内容,而不是在 f 中改变 *r*s 所指向的内容。交换应该影响传入函数的指针,而不是原始变量。

  3. 误解了 *z – 我把 *z 当作地址,认为 *z += 3 意味着“把指针向后移动三个位置”。实际上,*z 是一个 intz 所指向的值),所以 *z += 3 是把该整数加 3,而不是修改地址。

这些误解让我原地打转。

Takeaways

  • 回归基础 – 重新阅读指针的入门教材。
  • 逐步写出每一步 – 即使是看似平凡的操作也可能隐藏细微的细节。
  • 记住类型 – 清楚自己正在处理的是指针、指向指针的指针,还是实际的数值,这一点至关重要。
  • 可视化内存地址 – 绘制内存布局有助于避免把数值和地址混淆。
Back to Blog

相关文章

阅读更多 »

第4天 数据类型

Data types 数据类型是存储在 variable 中的信息种类,例如 numbers、characters、true/false 等。数据类型分为两类:-