带指针的数组长度

时间:2010-03-17 00:01:09

标签: c++ arrays pointers

如何在C ++中使用指针获取数组长度?我知道选项卡名称是指向第一个元素的指针,但下一步是什么?

4 个答案:

答案 0 :(得分:15)

你不能这样做。您需要将数组长度与数组指针一起传递,或者需要使用容器对象,例如std::vector

答案 1 :(得分:9)

你做不到。指针只是一个内存位置,并且不包含任何可以确定大小的特殊内容。

由于这是C ++,你可以做的是通过引用传递数组,如下所示:

template <typename T, size_t N>
void handle_array(T (&pX)[N])
{
    // the size is N

    pX[0] = /* blah */;
    // ...
    pX[N - 1] = /* blah */;
}

// for a specific type:
template <size_t N>
void handle_array(int (const &pX)[N]) // const this time, for fun
{
    // the size is N

    int i = pX[0]; // etc
}

但是否则你需要通过start&amp;结束并做一个减法,就像Alok建议的那样,一个开始&amp;大小,就像你建议的那样,或者抛弃静态数组并使用向量,就像Tyler建议的那样。

如果您知道要使用的阵列的大小,可以制作typedef

typedef int int_array[10];

void handle_ten_ints(int_array& pX)
{
    // size must be 10
}

只是尺寸:

template <typename T, size_t N>
size_t countof(T (&pX)[N])
{
    return N;
}

template <typename T, size_t N>
T* endof(T (&pX)[N])
{
    return &pX[0] + N;
}

// use
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7};

size_t count = countof(someArray); // 9
std::for_each(someArray, endof(someArray), /* ... */);

我不时使用这些实用程序功能。

答案 2 :(得分:3)

你的意思是:

int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */

答案 3 :(得分:0)

你不能,除非你知道结束指针取消引用的内容。在char数组的情况下,它是一个'\ 0',所以你可以循环,直到你读取该字符来计算长度。