提问者:小点点

空指针和指针算术


有没有办法在超过40之后停止下面的while循环的迭代? 我试图复制在null指针未找到的情况下迭代的链表概念。

int main() {
    int* arr = new int[4]{ 10,20,30,40 };
    //for(int i=0; i<4; ++i) -- works fine
    while (arr) {
        cout << *(arr++) << endl;
    }
    return 0;
}

共3个答案

匿名用户

在超过40之后,是否要停止下面的while循环的迭代

有两种方法可以停止循环:使条件变为false,或者跳出循环(break,goto,return,throw等)。 你的循环也不行。

您的条件是arr,只有当指针指向NULL时才为false。 您从不将null分配给arr,因此它从不为null。

我试图复制链表的概念

链表概念通常不适用于非链表的事物。 数组不是链表。

匿名用户

因为arr放在一个连续的内存中,所以您永远不会在arr之后得到内存地址的空值。

您可以尝试在联机编译器上执行以下代码。

#include <iostream>

int main()
{
    int* arr = new int[4]{ 10,20,30,40 };
    for(int i=0; i<4; ++i){
        std::cout << *(arr++) << std::endl;
        std::cout << arr << std::endl;
    }
    std::cout << "NULL is " << (int*)NULL; // NULL mostly stands for 0.
    return 0;
}

输出可能如下所示:

10    
0x182de74    
20    
0x182de78    
30    
0x182de7c    
40    
0x182de80    
NULL is 0

linkedlist为什么有效? 因为linkedlist将数据存储在非连续内存中,而next()会给出null作为列表结束的标志。

此外,您可能需要一本C++基础书籍。

这是书单。

匿名用户

使用一个保留值(如零)并将其追加到数组的末尾,就像使用旧的C字符串一样。 这被称为哨兵元素。

int* arr = new int[4]{ 10,20,30,40,0 };
while (arr) {
  ...