数组作为参数,变量混乱

时间:2013-03-15 01:42:46

标签: c++ arrays parameter-passing

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

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

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

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

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

5 个答案:

答案 0 :(得分:2)

你说:

  

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

没有。这不是真的。这个函数不是要确定一些东西,而是要INITIALIZE所有的数组(最多为listsize索引,顺便说一下:因为你可以传递大于这个列表大小的列表大小,这可能是危险的)和0。

  

将数组的值传递给listsize

不! listsize在这里不是元素的值,它是数组大小,看看“for”循环@Jason xD。 您是否尝试使用某些listize在某个数组上调用此函数?

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

如果您正在谈论“count = 0”,那么:

更常用的语法是:     for(int blah = 0; blah&lt; max; blah ++)

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

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

......也可以接受。

或者:

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

有时候(但不是在你的例子中),希望在for()语句的范围之外存在'blah',所以你可以在之后用它做一些事情:

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-statement本身内部会非常混乱( std :: vector&lt; std :: pair&gt; :: 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包装数组,因此可以将其视为常规变量(因为向量是一个)。

答案 4 :(得分:0)

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

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

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