【问题标题】:Array as parameter, variable confusion数组作为参数,变量混淆
【发布时间】:2013-03-15 01:42:46
【问题描述】:

好的,所以我得到了一些非常偏离课程的答案,所以我想我会编辑这篇文章并添加教科书中的注释以清楚起见:

有时,数组中的元素数量可能小于数组的大小。例如,存储学生数据的数组中的元素数量可能会随着学生删除或添加课程而增加或减少。在这种情况下,我们只想处理数组中包含实际数据的组件。要编写处理此类数组的函数,除了将数组声明为形式参数外,我们还要声明另一个形式参数,指定数组中元素的数量,如下面的函数:

void initialize(int list[], int listSize)
{
int count;
for (count = 0; count < listSize; count++)
list[count] = 0;
}

函数initialize的第一个参数是一个任意大小的int数组。调用函数initialize时,实际数组的大小作为函数initialize的第二个参数传递。

好的,现在我发布了包含教科书注释的整个示例,我的困惑是为什么他们将数组设置为零。注释给我的印象是这个函数允许用户使用他们想要的任何大小的数组,因为大小设置为零(我在这里猜)允许用户选择他们想要的任何大小的数组?并且每次都会重置为零,所以如果您下次需要更多或更少的单位,它将默认为零,以便您再次填充?

【问题讨论】:

  • 此代码将列表数组中的所有“插槽”初始化为零值。它可用于在重新使用之前初始化数组,以确保旧值保留在原位。大多数编译器将“默认初始化”一个数组(例如,对于整数为零)。
  • 您知道,您的函数将数组作为参数,而是一个指向int的指针。

标签: c++ arrays parameter-passing


【解决方案1】:

你说:

我知道函数initialize是用来确定 数组列表通过将数组的值传递给listsize

没有。这不是真的。这个函数不是用来确定什么,而是用 0 初始化所有数组(直到 listsize 索引,顺便说一句:这可能很危险,因为实际上你可以传递大于这个列表大小的 listsize)。

通过将数组的值传递给 listsize

不! listsize 这里不是元素的值,它是数组大小,请查看“for”循环@Jason xD。 你有没有尝试在一些列表大小的数组上调用这个函数?

【讨论】:

  • 您好cf,感谢您的注释!我实际上是指数组大小,我只是像个傻瓜一样措辞。
【解决方案2】:

如果您的代码格式正确,则语句 list[count] = 0; 每次通过您的 for 循环都会执行,这可能会更明显。

也就是说,每次循环都会将一个元素设置为零。结果是循环完成后,数组中的所有元素都会被置零。

【讨论】:

    【解决方案3】:

    如果你说的是“count = 0”,那么:

    更常用的语法是: for(int blah = 0; blah

    但是没有理由必须在 for() 语句本身中声明 'blah':

    int blah;
    for(blah = 0; blah < max; blah++)
    

    ...也可以接受。

    或者:

    int blah = 0;
    for( ; blah < max; blah++)
    

    有时(但不是在您的示例中)希望有 'blah' 存在于 for() 语句的范围之外,因此您可以在之后对其进行处理:

    int fileNum = 0;
    for( ; fileNum < maxFiles && file_exists(fileNum); fileNum++)
    {
        //...do something...
    }
    
    int lastFileWas = fileNum; //Either it's 'maxFile', or the first file that didn't exist.
    

    将变量放在 for() 语句之外的另一个原因是,当变量真的很大时,如果它在语句之外,它会使代码更易于阅读:

    std::vector< std::pair<std::string, int> >::iterator myIterator = myVector.begin();
    for( ; myIterator != myVector.end(); myIterator++)
    

    如果它在 for 语句本身内部会非常混乱(std::vector::iterator 是一个很长的变量写出来的名字会很乱塞进 for() 语句)。 (虽然这对于 C++11 的 'auto' 关键字来说不是问题)。

    如果你说的是“list[count] = 0;”,那么:

    对于数组,要分配一个值,您可以使用方括号(称为“下标运算符”)“索引”数组,并且您可以访问保存在数组内存中的各个变量(称为“元素”) :

    int myArray[10]; //10 integers in a block of memory.
    
    myArray[0] = 5; //Accessing the first element in the block of memory.
    myArray[3] = 17; //Accessing the fourth element in the block of memory.
    

    一般:

    由于您使用的是 C++,因此通常(90% 的时间)最好使用 std::vector。数组相当奇怪,因为它们与指向内存块的指针非常相似,并且不能像常规变量一样对待。除了许多其他好处之外,std::vector 还包装了数组,因此您可以将其视为常规变量(因为矢量就是其中之一)。

    【讨论】:

    • 谢谢!听起来确实像 Vectors 会更有用。我希望我可以使用它们,但在我们到达那一章之前,我们还不能使用它们。所以,就目前而言,为了证明我们找到了数组,我们不能在本周的作业中使用向量。这个练习之前的练习是展示如何使用 for 循环初始化数组。所以,我不认为这与能够重新调整数组变量计数有关。这就是为什么它被设置为零让我感到困惑。你知道我在哪里困惑吗?
    • 使用数组,您无法调整它们的大小。向量可以调整大小,但数组始终是固定大小。使用动态内存(您很可能尚未达到)您可以创建一个新数组,然后通过删除旧数组并创建一个更大的新数组来“调整”数组的大小,但这不是您发布的代码中发生的事情。您发布的代码只是将数组中的每个变量初始化/设置为值 0... 因为整数(在 C++ 中)默认情况下不会初始化。 "= 0" 将数组中的每个 int 设置为 0。
    • 我现在明白了。谢谢你!
    【解决方案4】:

    完成同样事情的另一种快速方法:

    memset(list, 0, sizeof(int)*listSize);
    

    这通过计算数据类型的大小乘以元素的数量并将其全部设置为 0 来获得分配给 list 的整个内存块。

    【讨论】:

    • 嗯,这听起来是个不错的捷径。唉,我被剥夺了使用这样一个命令的特权,因为我们还没有在书中讨论 memset。我的老师不允许我们使用它,因为我们没有在课堂上复习它:(
    【解决方案5】:

    它正在做它所说的,它正在初始化。在这种情况下,该方法只是将list 的每个元素设置为0。如果添加大括号可能会更清楚:

    for (count = 0; count < listSize; count++)
    {
      list[count] = 0;
    }
    

    So based on your updated post,这本书的描述是 1) 你可能不想处理整个数组,因为它可能只有一部分有有效数据 2) 为了编写函数来处理以这种方式运行的数组,函数处理这些数组不仅要以数组为参数,还要以有效元素的个数为参数。 3) 我们将提供一个示例函数initialize,它遵循我们刚刚描述的BUT 规则,文本中的任何内容实际上都没有说明initialize 的最终结果。

    我的上述描述以及其他帖子提供了对initialize 的准确描述。

    【讨论】:

    • 这实际上很有帮助,感谢您的意见。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2013-03-20
    • 2019-03-06
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多