我引用此链接Pointer expressions: *ptr++, *++ptr and ++*ptr来理解指针算法。
为什么下面的代码会无限循环?
int main(){
int a[4] ={1,2,3,4};
int *ptr = a;
while (++*ptr){
printf("%d",*ptr);
}
}
答案 0 :(得分:2)
您的代码不起作用有两个原因:
++*ptr
增加数字,而不是指针您可以使用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))