C 如何在不知道数组大小的情况下使用指针遍历数组

C 如何在不知道数组大小的情况下使用指针遍历数组,c,arrays,pointers,C,Arrays,Pointers,我有一个关于使用指针循环数组的问题,例如: bool loopArray(int* array) { /*for(){}*/ } 在这个函数中,我需要在不知道数组大小的情况下循环这个数组,如何循环它?这是不可能的。你需要一些关于尺寸的信息;否则你将不可避免地越过它的边界 指针不包含有关已分配数组大小的任何信息;它只指向记忆中的一个地方 除了 也许有办法;如果您知道数组中必须始终存在的最后一个元素是什么,那么。例如,在字符数组中,最后一个元素是\0,您不能这样做 但是您可以在C标准库如何建

我有一个关于使用指针循环数组的问题,例如:

bool loopArray(int* array)
{
   /*for(){}*/
}
在这个函数中,我需要在不知道数组大小的情况下循环这个数组,如何循环它?

这是不可能的。你需要一些关于尺寸的信息;否则你将不可避免地越过它的边界

指针不包含有关已分配数组大小的任何信息;它只指向记忆中的一个地方

除了 也许有办法;如果您知道数组中必须始终存在的最后一个元素是什么,那么。例如,在字符数组中,最后一个元素是\0

,您不能这样做

但是您可以在C标准库如何建模字符串方面做一些事情。给定char*或const char*,函数(如strlen)在到达0时停止,称为空终止符

所以我要么保留一个int值作为终止符,要么传递长度

无论哪种方式,如果您不想修改内容,请传递一个常量int*。

您不能

嗯,就是这样

您可以提供一个尺寸参数:

bool loopArray(int* array,size_t sz)
{
   for(size_t i=0;i<sz;++i){
       //Do stuff with array[i]....
   }   
}
在前面的示例中,您在调用之前应该定义int*end=array+sz

第二种方法速度更快,而且还有一个额外的好处,其他C程序员将开始认识到你是他们自己的一员!如果你认为这是一种好处

PS:为了完整性:你可以确保你有一个“哨兵”。哨兵是表示“结束”的某个值。C标准库使用“\0”作为字符串中的哨兵。更多的遗憾。 这一技巧尤其适用于处理指针数组并使用NULL作为哨兵的情况。 然而,作为一个一般性的答案,这并不是什么值得推荐的东西。它容易出错,如果您需要知道其大小,它会带来很大的开销,它会限制您在不修改“子数组”的情况下访问“子数组”的能力,并禁止您使用sentinel作为值,并会破坏意外使用的程序。
除此之外,它还很棒。

可以通过使用sentinel值来完成,例如字符数组用作字符串时所具有的属性。例如,-1,当所有其他值都为正值时。您有2个选项:数据包含可以测试的特殊值,或者将数组大小作为附加参数传递。使用后者,这是更明智的选择。如果数组中的最后一个值用于表示数组的结束,则可以使用后者。这与C中的字符串类似,即它们以\0结尾,标记字符串的结尾。请注意,使用名称数组定义指针并不能使其成为数组。这是一个指针。对不起,没有尺码。它将只返回指针本身的大小。您可以根据需要进行循环。如果你犯了一个错误,你就知道你做得太过分了。向上投了同样的开场白!还有一个给你。让我们测试sockpuppet检查器的健壮性。。。
bool loopArray(int* array,int* end)
{
   for(;array!=end;++array){
       //Do stuff with *array....
   }   
}