带指针的数组长度 C++如何仅用指针获得数组长度?我知道选项卡名是指向第一个元素的指针,但下一步怎么办?
您不能这样做。您需要将数组长度与数组指针一起传递,或者需要使用容器对象,例如带指针的数组长度 C++如何仅用指针获得数组长度?我知道选项卡名是指向第一个元素的指针,但下一步怎么办?,c++,arrays,pointers,C++,Arrays,Pointers,您不能这样做。您需要将数组长度与数组指针一起传递,或者需要使用容器对象,例如std::vector您的意思是: int a[10]; int *start = a; int *end = a + 10; size_t n = end - start; /* pointers! :-) */ 你不能,除非你知道结束指针指向什么。对于字符数组,它是一个“\0”,因此您可以循环直到读取该字符以计算长度。您不能。指针只是一个内存位置,不包含任何可以确定大小的特殊内容 因为这是C++,你可以做的是通过引
std::vector
您的意思是:
int a[10];
int *start = a;
int *end = a + 10;
size_t n = end - start; /* pointers! :-) */
你不能,除非你知道结束指针指向什么。对于字符数组,它是一个“\0”,因此您可以循环直到读取该字符以计算长度。您不能。指针只是一个内存位置,不包含任何可以确定大小的特殊内容
因为这是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
}
就尺寸而言:
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), /* ... */);
模板
尺寸(t和pX)[N])
{
返回N;
}
模板
T*endof(T(&pX)[N])
{
返回&pX[0]+N;
}
//使用
int someArray[]={1,2,6,2,8,1,3,3,7};
size_t count=计数(someArray);//9
std::for_each(someArray,endof(someArray),/*…*/);
我经常使用这些实用程序函数。No,“end”指针通常是超过end的一个指针(这是合法的),具体来说就是end-start=length,这样你就可以为(int*I=start;I!=end;++I)执行
之类的操作。最好使用typedef
来创建数组类型,并接受对它的引用,以消除模板
,除非这些方法将在头文件中,并且数组大小实际上是不同的(但剩余的编译时是确定的)。@Potatoswatter:我不知道如何生成这样的typedef。函数在通过调用实例化之前不知道N。我将添加一个typedef的示例,这就是你的意思吗?是的,你添加的示例typedef就是我的意思<代码>模板
非常适合自动调整大小整数[]={…}代码>但是实例化可能会带来不便/混乱,并且好处很小,除非数组是这样声明的。或者用户碰巧正在使用几个固定大小的程序。目前,我希望在C++4x最终确定时能够获得社会保障。我不知道有什么大不了的:现在就可以使用boost::array。没什么大不了的;仅仅是哀悼公爵Nukm永远的进步C++标准委员会的进展。在字符串的情况下,它通常是代码> \ 0 < /代码>。并非每个字符数组都是字符串。
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), /* ... */);