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



为什么当我像这样递增**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会将指针移动到超出范围的位置,并且不允许取消引用。

CCD_ 6指向5元素阵列CCD_。递增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 );

因为在该表达式CCD_ 13中取消引用指针没有效果。

当指针CCD_ 14指向数组的第一个元素CCD_。

因此,这个调用

printf("%d",*ptr );

输出

1

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

int **pptr = &ptr;

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

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

这就是区别。

相关内容

  • 没有找到相关文章

最新更新