如何仅使用指针在C++中获取数组长度?我知道tab名称是指向第一个元素的指针,但接下来应该怎么做?
您无法这样做。您需要将数组长度与数组指针一起传递,或者您需要使用诸如std::vector
的容器对象。
你无法做到。指针只是一个内存位置,没有任何特殊的东西可以确定大小。
由于这是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
,除非这些方法将在头文件中并且数组大小实际上是变化的(但仍然是编译时确定的)。 - Potatoswattertemplate<size_t>
可以很好地支持自动尺寸的int ary[] = {…};
,但是实例化可能会不方便,也容易引起混淆。据我所知,除非数组是这样声明的,否则收益微乎其微。或者用户碰巧正在使用几个固定大小的数组。 - Potatoswatterint a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
for (int* i = start; i != end; ++i)
这样的操作。 - Tyler McHenry除非您知道结束指针的解引用内容,否则无法完成。对于char数组,它是'\0',因此您可以循环读取该字符直到找出长度。
\0
。并不是每个字符数组都是一个字符串。 - Potatoswatter