当我们不知道数组的大小时,如何遍历整数数组? [复制]
Posted
技术标签:
【中文标题】当我们不知道数组的大小时,如何遍历整数数组? [复制]【英文标题】:How can we iterate through an array of integers when we do not know the size of the array? [duplicate] 【发布时间】:2017-07-19 04:20:51 【问题描述】:This is a code from geeksforgeeks计数排序实现:
已经使用下面的 for 循环来遍历一个字符串 -
char arr[] = "geeksforgeeks";
for(i = 0; arr[i]; ++i)
++count[arr[i]];
从谷歌搜索我可以理解这个条件隐含地计算为arr[i]!='\0'
。我理解正确了吗?
如果我要使用类似的 for 循环来遍历整数数组,它会评估为 arr[i]!=0
吗?
或者当我们不知道它的大小时,有没有更好的方法来遍历整数数组。我是初学者,请尽量提供不涉及C语言高级数据结构的建议。
【问题讨论】:
这取决于:0 是数组中的有效值吗?如果是这样,您显然不能将其用作数组末尾的标记 这是一个字符数组,而不是整数。它起作用的原因是因为数据是一个以空字符结尾的字符串。您基本上已经实现了strlen
功能。所以不清楚你的意思是“当我们不知道它的大小时,有没有更好的方法来迭代整数数组”。
比如我有一个数组,arr[] = 1,2,3,4;而且我不想计算数组大小来遍历数组。我怎么能像他们在我引用的例子中那样做呢。
@john 如果你有arr[] = 1,2,3,4;
,那么bytes 中数组的大小是sizeof(arr)
,数组中的元素数是sizeof(arr) / sizeof(arr[0])
。跨度>
不确定这个问题是如何重复的。我要问的问题是关于在大小为“未知”时迭代数组。我没有问“如何计算数组的大小”的问题。无论如何,我感谢所有提供解释的人。它通过提及哨兵给了我一个很好的方向:) 谢谢大家!
【参考方案1】:
是的,计算结果为零的整数表达式将被for
构造视为false
并结束循环。
由于字符串由值为 0 的 '\0'
字符终止,因此可以检测字符串的结尾。
是的,您可以使用它来迭代任何整数数组(或指针,其中NULL
被认为是false
)数组,但当然以零终止此类数组不太常见(因为零是一个相当有用的整数)。
如果您可以使用其他值来标记结尾(这称为a "sentinel"),您当然可以使用它,而不是长度或零。零没有什么神奇之处,除了对于字符串来说,它是约定,因此得到很好的支持。
【讨论】:
这个问题之前已经被问过很多次并且有很多重复,包括高度(+500)赞成的问题。您是一位享有盛誉的资深会员,因此获得了执行以下操作的特权和理解。通过投票关闭作为重复而不是回答来减少重复,从而改进 ***。这样的行动将极大地改善社区,而对您自己的劣势可以忽略不计。谢谢。 感谢您的详细回答。我将看看我们如何为整数数组提出一个标记。【参考方案2】:除非您确定数组末尾有某种标记值,否则您无法遍历数组,除非您知道它的大小。
标记值的一个例子是字符串的'\0'
。
当您想使用整数数组时,您应该同时保留数组和大小。这就是为什么将数组作为输入参数的函数需要一个指针和一个int
:
void example(int* array, int size) /* ... */
【讨论】:
这个问题之前已经被问过很多次并且有很多重复,包括高度(+500)赞成的问题。您是一位享有盛誉的资深会员,因此获得了执行以下操作的特权和理解。通过投票关闭作为重复而不是回答来减少重复,从而改进 ***。这样的行动将极大地改善社区,而对您自己的劣势可以忽略不计。谢谢。 @2501:我认为这是向 OP 解释 sentinel values 概念的好机会。您关闭问题的副本没有提及该概念,这与 OP 的问题有关。 这个问题有很多重复项,其中包括谈论哨兵值的答案。您完全有能力找到它们并投票结束。以上是关于当我们不知道数组的大小时,如何遍历整数数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当 UIPanGesture 上的状态为 .ended 时遍历数组