2

我是一个新手,正在尝试使用下面的示例来理解指向数组的指针的概念。谁能告诉我循环的退出条件应该是什么?
while 循环似乎永远在运行,但程序终止时没有输出。
谢谢你。

typedef struct abc{
    int a;
    char b;
} ABC;

ABC *ptr, arr[10];

int main()
{
    ptr = &arr[0];
    int i;
    for(i = 0; i < 10; i++){
        arr[i].a = i;
    }
    while(ptr!=NULL){
        printf("%d \n", ptr->a);
        ptr++; //Can I use ptr = ptr + n to skip n elements for some n?
    }
}
4

2 回答 2

2
while(ptr!=NULL){

这将一直运行到ptr变为NULL。由于它指向数组的第一个元素,并且它总是递增,而且我们不知道任何其他实现细节,它可能会或可能不会变成NULL. 这不是您检查是否经过阵列末端的方式。你需要

while (ptr < arr + 10)

反而。

我可以用ptr = ptr + n一些 n 跳过 n 个元素吗?

当然。当我们这样做时:为什么不ptr += n呢?

于 2013-09-22T15:41:13.013 回答
0

循环不是无限的,它在 ptr == 0 时停止。假设您有一台 32 位计算机,ptr 是 32 位宽。所以它可以保存从 0 到 4294967296-1(0 到 2 ^ 32 -1)的数字。每次通过循环它都会将 8 添加到 ptr。最终 ptr 将变为 4294967296-8。添加 8 会导致 4294967296 - 但这是溢出,因此实际结果为 0。

注意:这仅在 PTR 恰好以 8 的倍数开始时才有效。将其偏移 4,这将是一个无限循环。

将 printf 从 "%d" 更改为 "%x" - 我认为以十六进制打印数字会更清楚。

于 2013-09-22T15:43:53.947 回答