【发布时间】:2025-12-02 15:25:02
【问题描述】:
如何在 C++ 中仅使用指针获取数组长度?我知道选项卡名称是指向第一个元素的指针,但接下来呢?
【问题讨论】:
如何在 C++ 中仅使用指针获取数组长度?我知道选项卡名称是指向第一个元素的指针,但接下来呢?
【问题讨论】:
你做不到。您需要将数组长度与数组指针一起传递,或者您需要使用容器对象,例如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 建议的那样传递 start 和 end 并执行减法运算,或者像 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,除非这些方法将在头文件中并且数组大小实际上是不同的(但仍然是编译时确定的)。
template<size_t> 与自动调整大小的 int ary[] = {…}; 很好,但实例化可能不方便/令人困惑,而且除非数组像这样声明,否则好处很少 AFAIK。或者用户碰巧在使用几个固定尺寸。
你的意思是这样的:
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
【讨论】:
for (int* i = start; i != end; ++i) 之类的操作。
你不能,除非你知道结束指针指向什么。在 char 数组的情况下,它是一个 '\0',所以你可以循环直到你读到那个字符来计算长度。
【讨论】:
\0。并非每个 char 数组都是字符串。