当我们不知道数组的大小时,如何遍历整数数组? [复制]

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 时遍历数组

如何在C语言中不指定数组大小的情况下将数字读入数组

如何在加载了 JSON API 数据的 tableview 单元格中保存复选标记属性?

遍历数组列表

遍历整数数组所有组合的算法