如何从指针中获得数组的长度

How to get the length of an array from a pointer?

本文关键字:数组 指针      更新时间:2023-10-16

我很难找到一个指针数组的长度。比如我有:

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) == '') // returns 5...
    break;
   count++;
}

我如何让它返回长度40只是从指针到数组中的第一个元素?
我发现我能做到。

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

返回39,这很好,但我觉得这在某些情况下可能会有bug。

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

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

c++有合适的字符串类型:

std::string

,您可能会在这里发现有用的。即使您将它传递给接受const char*的函数,它也有.c_str()方法,允许您将它传递给接受指针的函数。如果其他函数需要修改字符串,您可以使用&str[0],它对许多c++实现都有效,并且需要在c++ 11中工作。只是要确保你把它们调整到正确的大小。

c++中的其他容器:

std::array (c++ 11)常量数组。比普通的旧C数组好,因为它有size()方法。std::vector动态数组(Java ArrayList等效)

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

确实不能从指向数组元素的指针中获取数组的大小。

如果你只有一个指针的原因是因为你正在实现一个以数组形参作为实参的函数,就像这样:

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;
}

如果你想保持简单而不使用#include <array.h>,你可以在数组大小的地方创建一个struct。有点像:

struct
{
    int* int_Array;
    int array_Size;
}

这样,你可以做任何你想做的(比如删除你的实例或其他)