【问题标题】:I'm new to pointer to pointer concept as I'm learning how to use the incrementing in pointer to pointer我是指针概念的新手,因为我正在学习如何使用指针指针的递增
【发布时间】:2021-07-28 20:05:00
【问题描述】:

为什么当我像这样递增 **pptr++ 而不是 *ptr++ 时,我得到了一些垃圾值?谁能帮帮我?

#include<stdio.h>
int main()
{
    static int array[] ={9,1,2,3,4}; 

    int *ptr = array;
    int **pptr = &ptr;


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

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

    return 0;
}

【问题讨论】:

  • 我建议你拿一些纸和一支铅笔,把数组画成一个矩形,你把它分成五个正方形。第一个方格是array[0],最后一个方格是array[4]。然后为ptr 绘制另一个正方形,为pptr 绘制另一个正方形。然后画箭头从pptrptr,从ptrarray[0]。这就是指针真正起作用的方式。
  • 至于++ 会发生什么,the answer by MiceCAT 对此进行了解释。有了这些信息,当你做增量时,在你的纸上擦除并重新绘制相应的箭头。请注意ptrnow 是如何在您的纸上指向arrow[1] 的?注意pptr 不再指向任何有效的地方。
  • **pptr++; 没有任何意义,所以这就是原因。在少数情况下您实际上需要使用指向指针的指针,而这不是其中之一。

标签: c dereference pointer-arithmetic post-increment


【解决方案1】:

**pptr++;*ptr++; 正在递增指针,而不是它们所指向的内容。

pptr 指向的是ptr,可以看成一元数组。递增 pptr 会将指针移动到超出范围并禁止取消引用。

ptr 指向 5 元素数组 array 的第一个元素。递增ptr 将移动指针指向第二个元素。您仍然可以取消引用它。

【讨论】:

    【解决方案2】:

    由于这些声明,指针pptr 指向指针(对象)ptr

    int *ptr = array;
    int **pptr = &ptr;
    

    这个表达式

    **pptr++;
    

    可以像这样重写

    pptr++;
    

    因为应用解引用运算符没有效果。

    所以现在增加pptr 后的指针指向指针ptr 之外的内存,并在以下语句中取消引用它

    printf("%d",**pptr );
    

    导致未定义的行为。

    而不是这两个语句

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

    你可以只写一个语句

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

    输出将是

    9
    

    虽然后递增指针没有意义。

    至于这些说法

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

    那么它可能会被重写为

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

    因为取消引用此表达式中的指针*ptr++ 没有效果。

    由于指针ptr 指向数组array 的第一个元素,然后在递增后它指向数组的第二个元素。

    因此调用

    printf("%d",*ptr );
    

    输出

    1
    

    为了更清楚,你可以考虑这个声明

    int **pptr = &ptr;
    

    作为指针的声明,该指针指向只有单个元素的数组的第一个元素。因此,递增指针会导致指针指向具有单个元素的数组之外。

    与指针pptr 不同,指针ptr 指向包含多个元素的数组的第一个元素。所以在增加指针后,它将指向一个有效的对象:数组的第二个元素。

    这就是区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多