【问题标题】:How can we iterate through an array of integers when we do not know the size of the array? [duplicate]当我们不知道数组的大小时,如何遍历整数数组? [复制]
【发布时间】:2023-03-13 05:12:01
【问题描述】:

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])。跨度>
  • 不确定这个问题是如何重复的。我要问的问题是关于在大小为“未知”时迭代数组。我没有问“如何计算数组的大小”的问题。无论如何,我感谢所有提供解释的人。它通过提及哨兵给了我一个很好的方向:) 谢谢大家!

标签: c arrays loops


【解决方案1】:

是的,计算结果为零的整数表达式将被for 构造视为false 并结束循环。

由于字符串由值为 0 的 '\0' 字符终止,因此可以检测字符串的结尾。

是的,您可以使用它来迭代任何整数数组(或指针,其中NULL 被认为是false)数组,但当然以零终止此类数组不太常见(因为零是一个相当有用的整数)。

如果您可以使用其他值来标记结尾(这称为a "sentinel"),您当然可以使用它,而不是长度或零。零没有什么神奇之处,除了对于字符串来说,它是约定,因此得到很好的支持。

【讨论】:

  • 这个问题之前已经被问过很多次并且有很多重复,包括高度(+500)赞成的问题。您是一位享有盛誉的资深会员,因此获得了执行以下操作的特权和理解。通过投票关闭作为重复而不是回答来减少重复,从而改进 StackOverflow。这样的行动将极大地改善社区,而对您自己的劣势可以忽略不计。谢谢。
  • 感谢您的详细回答。我将看看我们如何为整数数组提出一个标记。
【解决方案2】:

除非您确定数组末尾有某种标记值,否则您无法遍历数组,除非您知道它的大小。

标记值的一个例子是字符串的'\0'

当您想使用整数数组时,您应该同时保留数组和大小。这就是为什么将数组作为输入参数的函数需要一个指针和一个int

void example(int* array, int size) { /* ... */ }

【讨论】:

  • 这个问题之前已经被问过很多次并且有很多重复,包括高度(+500)赞成的问题。您是一位享有盛誉的资深会员,因此获得了执行以下操作的特权和理解。通过投票关闭作为重复而不是回答来减少重复,从而改进 StackOverflow。这样的行动将极大地改善社区,而对您自己的劣势可以忽略不计。谢谢。
  • @2501:我认为这是向 OP 解释 sentinel values 概念的好机会。您关闭问题的副本没有提及该概念,这与 OP 的问题有关。
  • 这个问题有很多重复项,其中包括谈论哨兵值的答案。您完全有能力找到它们并投票结束。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2015-04-07
  • 2019-09-03
  • 2015-04-29
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多