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