我有一个关于使用指针循环数组的问题,例如:
bool loopArray(int* array)
{
/*for(){}*/
}
在这个函数中,我需要循环遍历这个数组而不知道数组的大小,如何循环它?
答案 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*
。