如何使用指针循环数组而不知道数组的大小

时间:2015-01-13 11:42:47

标签: c arrays pointers

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

bool loopArray(int* array)
{
   /*for(){}*/
}

在这个函数中,我需要循环遍历这个数组而不知道数组的大小,如何循环它?

3 个答案:

答案 0 :(得分:4)

你不能。

Errrm,就是这样。

您要么提供尺寸参数:

bool loopArray(int* array,size_t sz)
{
   for(size_t i=0;i<sz;++i){
       //Do stuff with array[i]....
   }   
}

或指向数组'end'的指针。你被允许在结束时指向一个,并且约定是在结束时传递一个接一个结束。这允许您在begin==end

时指定“空”
bool loopArray(int* array,int* end)
{
   for(;array!=end;++array){
       //Do stuff with *array....
   }   
}

查看上一个示例,您将在调用之前定义int* end=array+sz

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

PS:为了完整性:你可以确保你有一个'哨兵'。哨兵是一些表示'结束'的值。 C标准库使用'\0'作为字符串中的标记。更可惜的是。 当你处理指针数组并使用NULL作为哨兵时,这个技巧可能会起作用。 但是,作为一般性答案,不建议这样做。它容易出错,如果你需要知道大小就会有很大的开销,它会限制你在不修改它们的情况下访问“子阵列”的能力,并且禁止你使用sentinel作为一个值并打破那些偶然发生这种情况的程序。 除此之外它很棒。

答案 1 :(得分:3)

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

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

<强>除非 可能有办法解决;如果你知道你的数组中的最后一个元素是什么(必须始终存在)。这用于char数组(其中最后一个元素是\0

答案 2 :(得分:2)

你不能。

但是你可以在C标准库如何模拟字符串方面做点什么。给定char*const char*strlen等函数会在达到0时停止(称为空终止符)。

所以(i)保留一个int值作为你的终结者,或者(ii)传递长度。

无论哪种方式,如果您不打算修改内容,请传递const int*