我是指针指针概念的新手,因为我正在学习如何使用指针指针的递增

问题描述

为什么当我像这样递增 **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;
}

解决方法

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

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

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

,

由于这些声明,指针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 指向包含多个元素的数组的第一个元素。所以在增加指针后,它将指向一个有效的对象:数组的第二个元素。

这就是区别。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...