用++ * ptr指向int数组并进入无限循环

时间:2014-12-05 11:09:10

标签: c pointers

我引用此链接Pointer expressions: *ptr++, *++ptr and ++*ptr来理解指针算法。

为什么下面的代码会无限循环?

int main(){
 int a[4] ={1,2,3,4};
 int *ptr = a;
 while (++*ptr){ 
    printf("%d",*ptr);
 }
}

5 个答案:

答案 0 :(得分:2)

您的代码不起作用有两个原因:

  • ++*ptr增加数字,而不是指针
  • 您正在迭代数组而不是C字符串

您可以使用while (*ptr++)表达式迭代C字符串作为循环条件。这个小技巧适用于C字符串,因为它们是空终止的。为了使它适用于数组,你需要在数组的末尾加零,并同意不在数组的其他地方使用零:

int a[4] ={1,2,3,4, 0};
int *ptr = a;
int last;
while (last = *ptr++) { 
    printf("%d", last);
}

注意,由于我们在循环的头部中递增指针,我们应该将指针指向的最后一个值存储在一个单独的变量中。否则我们会跳过一个数组元素。

答案 1 :(得分:1)

in循环条件值为0,表示时间仅循环终止,但您只是递增数组值的第一个位置,因此不会出现零值。

答案 2 :(得分:0)

问题出在以下几行。只有当 ++ * ptr 的值为 false 0 时,您的时间才会中断。但它永远不会变成 0 false

++*ptr

so while(NON ZERO) will result in infinite loop.

答案 3 :(得分:0)

循环是“无限的”,因为while语句中的条件始终为true,直到您达到int可以容纳的最大值,之后您将获得未定义的行为。

该行发生的是:

while (++*ptr)

首先,指针被解除引用*ptr,获取数组a中第一个元素的值,然后该值递增1。然后评估结果值,得出真实结果。

在每个循环中都会发生同样的情况,指针ptr始终指向同一个元素,第一个元素ptr == &a[0],并且不断将该元素的值递增一a[0] = a[0]+1。< / p>

答案 4 :(得分:-1)

您正在递增相应的第0个位置的值。因此,数组的起始位置值递增。所以循环无限执行。使while循环如下。

while(*(++ptr))