20

我无法找到指针数组的长度。假设我有:

char array[40] = "hello"; // size 40
int length =  sizeof array / sizeof array[0]; // no problem returns 40

//如何仅使用指向该数组中第一个元素的指针来获取数组的长度?

 char* pchar = array;

//如果

std::strlen(pchar); // this returns the length of 5... i want length 40

//如果

int count = 0;
while(true)
{
  if(*(pchar + count) == '\0') // returns 5...
    break;
   count++;
}

如何让它仅从指向数组中第一个元素的指针返回长度 40?
我发现我可以做到这一点。

int count = 0;
    while(true)
    {
      if(*(pchar + count) == '\0' && *(pchar + count + 1) != '\0') 
             break;

       count++;
    }

这返回 39,这很好,但我觉得在某些情况下这可能是错误的。

4

5 回答 5

16

你不能,我害怕。您需要将数组的长度传递给需要它的任何人。或者您可以使用 a std::arrayorstd::vector或类似的,它们自己跟踪长度。

于 2013-04-02T21:17:33.873 回答
5

C++ 有正确的字符串类型:

std::string

您可能会在这里找到帮助。即使您将它传递给接受的函数const char*,它也具有.c_str()允许您将其传递给接受指针的函数的方法。如果其他函数需要修改字符串,您可以使用&str[0]对许多 C++ 实现都有效且适用于 C++11 的函数。只需确保将它们 resize() 到正确的大小。

C++ 中的其他一些容器是:

std::array(C++11) 固定大小的数组。比普通的旧 C 数组更好,因为它有size()方法。 std::vector动态数组(JavaArrayList等效)

至于你的问题 - 没有办法找到一个指向数组的大小。你怎么能那样做?这只是一个愚蠢的指针。

于 2013-04-02T21:33:25.483 回答
4

你不能。道德是,不要使用指针和数组,使用向量。你总是可以得到一个向量的大小。

于 2013-04-02T21:19:48.530 回答
4

确实,您无法从指向数组元素的指针中获取数组大小。

如果您只有一个指针的原因是因为您正在实现一个将数组参数作为参数的函数,如下所示:

void foo (T *p) {
    // p is a pointer to T
}

那么您可以使用模板函数来获取函数的数组大小。

template <unsigned N, typename T>
void foo (T (&p)[N]) {
    // p is a reference to an array[N] of T
    std::cout << "array has " << N << " elements" << std::endl;
    std::cout << "array has "
              << sizeof(p)/sizeof(p[0])
              << " elements"
              << std::endl;
}

int main ()
{
    int array[40];
    char array2[25];
    foo(array);
    foo(array2);
    return 0;
}
于 2013-04-02T21:23:37.893 回答
1

如果您想保持简单而不使用#include <array.h>,您可以在数组大小所在的位置创建一个结构。有点像:

struct
{
    int* int_Array;
    int array_Size;
}

这样,您可以随心所欲(例如删除您的实例或其他东西)

于 2015-10-20T19:47:44.257 回答