【问题标题】:Pointer indirection issue指针间接问题
【发布时间】:2014-08-18 09:58:54
【问题描述】:

这个程序产生 0 1 1 作为我的预期输出 0 1 2 的输出。谁能解释为什么增量运算符不能作为前缀工作?

#include <stdio.h> 
int main(void)
{
    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));

    for (i=0; i<5; i++)
        *(ptr + i) = i;

    printf("%d ", (*ptr)++);
    printf("%d ", *ptr);
    printf("%d ", *++ptr);
    return 0;
}

【问题讨论】:

  • @BaummitAugen 是的,但是标签也说 C++,而且问题在两者中都是有效的。 我不认为这是一个有效的编辑;如果有的话,最好从标题中删除对标记(“in C”)的引用。
  • 你想要*ptr++。还有#include &lt;stdlib.h&gt;
  • 顺便说一句,使用调试器会比在 SO 上询问要快得多。
  • @BasileStarynkevitch ,尚未学习使用 gdb。谢谢。
  • @Angew 我对标记为多种语言的问题的问题是,即使在这种简单的情况下,答案也往往不同。如果这是一个 C++ 问题,最好告诉 OP 不要使用 &lt;stdio.h&gt;malloc、C 风格的强制转换。这显然不适用于 c 问题。

标签: c++ c pointers gcc


【解决方案1】:

假设int *p = ptr:

printf("%d ", (*ptr)++);  // print ptr[0] then increment ptr[0] ==> 0
printf("%d ", *ptr);      // print ptr[0] ==> 1
printf("%d ", *++ptr);    // increment ptr then effectively print p[1] ==> 1

【讨论】:

    【解决方案2】:

    *++ptr 等价于*(++ptr):递增ptr,然后取消引用递增的指针。第三个printf 中的++(*ptr) 将提供所需的输出。

    【讨论】:

      【解决方案3】:

          printf("%d ", (*ptr)++);
      

      您正在递增内存位置ptr 内的数字*ptr;你不要触摸指针 ptr 本身。

      在此之前,printfptr[0] 包含 0。您增加了它。

      【讨论】:

        【解决方案4】:

        ++(*ptr) 怎么样?这相当于三行中第一行的后缀。

        您的原始代码正在有效地执行 *(++ptr),这无疑不是您想要的。

        【讨论】:

          【解决方案5】:

          这是因为:
          *++ptr 你增加了指针 ptr 而不是指针的值。

          【讨论】:

            【解决方案6】:

            存储在指针中的地址保持不变,直到程序终止。 这两个语句printf("%d ", (*ptr)++); printf("%d ", *++ptr); 递增存储在 ptr 中的值。第一个语句是后增量,第二个是前增量`

            要增加地址,您可以使用 ++ptr。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-04
              相关资源
              最近更新 更多