指针与数组长度

8

如何仅使用指针在C++中获取数组长度?我知道tab名称是指向第一个元素的指针,但接下来应该怎么做?

4个回答

15

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


2
到那时,我预计在收集社会保障金的同时,C++4x也将完成。 - Tyler McHenry
我不明白这有什么大不了的:你现在就可以使用boost::array。 - Alexandros Gezerlis
2
没什么大不了的,只是感叹C++标准委员会进展缓慢,有点像《Duke Nukem Forever》游戏一样。 - Tyler McHenry
1
http://herbsutter.wordpress.com/2010/03/13/trip-report-march-2010-iso-c-standards-meeting/ - Ben Voigt

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
}

除此之外,您需要传递起始和结束位置并进行减法运算,就像Alok建议的那样,使用起始位置和大小,就像您建议的那样,或者放弃使用静态数组并使用向量,就像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), /* ... */);

我偶尔使用这些实用函数。


最好使用typedef创建一个数组类型,并接受对其的引用,以消除template,除非这些方法将在头文件中并且数组大小实际上是变化的(但仍然是编译时确定的)。 - Potatoswatter
@Potatoswatter:我不知道有什么方法可以做到这样的typedef。在调用实例化之前,该函数对N是未知的。我会添加一个typedef的示例,这是你的意思吗? - GManNickG
是的,你添加的typedef就是我所需要的。使用template<size_t>可以很好地支持自动尺寸的int ary[] = {…};,但是实例化可能会不方便,也容易引起混淆。据我所知,除非数组是这样声明的,否则收益微乎其微。或者用户碰巧正在使用几个固定大小的数组。 - Potatoswatter

3
你的意思是像这样吗?
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */

2
不,"end"指针通常是指向末尾的下一个位置(合法的),这样可以满足 end - start = length 的关系,并且可以执行类似 for (int* i = start; i != end; ++i) 这样的操作。 - Tyler McHenry

0

除非您知道结束指针的解引用内容,否则无法完成。对于char数组,它是'\0',因此您可以循环读取该字符直到找出长度。


1
字符串的情况下,惯例上是\0。并不是每个字符数组都是一个字符串。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接