为什么当我像这样递增**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
指向包含一个以上元素的数组的第一个元素。因此,在增加指针后,它将指向一个有效的对象:数组的第二个元素。
这就是区别。