当大小未知时,如何遍历指向数组(int *)的指针?

时间:2019-04-06 18:21:37

标签: c++ arrays pointers

我正在研究一些编码问题,并且遇到了一个问题,其中输入数组是“ int *”而不是向量。

这使我提出疑问,如果我们不知道大小,如何遍历该数组:

vector<int> cellCompete(int* states, int days) 
{
    // my try: 
    for (; *states; states++ ) {
        cout << *(states) << " ";
    }

    vector<int> testArray;
    return testArray;
}

如您所见,我已经尝试了一种遍历数组的简单方法,尝试检查指针是否会在某个点返回nullptr。

示例:

[1, 0, 0, 0, 0, 1, 0, 0] returned "1" as output
[1, 1, 1, 0, 1, 1, 1, 1] returned "1 1 1" as output.

但是,此方法在以下示例中有效:

#include <iostream>
using namespace std;

int main () {
   // an array with 5 elements.
   double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
   double *p;

   p = balance;

    for (; *p; p++ ) {
        cout << *(p) << endl;
    }

   return 0;
}

这是问题https://www.geeksforgeeks.org/active-inactive-cells-k-days/,但是由于它是机密信息,因此我无法分享我遇到该问题的链接。在我必须解决的版本中,函数输入为“ int *”,而不是其他选项。

其他: 在同一个网站上,我的方法适用于另一个输入相似的问题:

int generalizedGCD(int num, int* arr)
{
    // WRITE YOUR CODE HERE  
    for (; *arr; arr++ ) {
        cout << *(arr) << " ";
    }

    return 1;
}

输入示例为:

[2、3、4、5、7]和[2、4、6、8、10]

当我们不知道数组的大小时,是否存在更可靠的方法来遍历指向数组的指针?

我在网上找不到的任何资料都提供了一种在不知道大小的情况下进行迭代的方法。

我想表达的是,这个问题确实表明了数组的大小,但这只是让我思考是否有一种方法可以在没有给定大小的情况下进行迭代。

1 个答案:

答案 0 :(得分:1)

不,没有。

您要么需要某种终止字符(例如以null终止的字符串),要么显式提供大小。

此外,您的方法无效且不安全。 *state不会告诉您指针是否为nullptroperator*正在取消引用并获取指针引用的对象的值。这就是循环一旦在数组中达到0值就停止的原因。如果数组中没有零,则循环将继续进行,直到为数组分配的空间用完为止,并且您将具有无法寻址的访问,从而导致未定义的行为,因为您将访问内存,可以使用该内存否则,甚至可能是只读的或超出进程的地址空间,从而导致崩溃。

要获取指针(地址)的实际值,需要检查state而不是*state,但不会是nullptr。变量state的值只是一个数字(等于写入数组的内存的地址),而变量++state只是使该数字递增。