0

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

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

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

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

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

4

5 回答 5

2

你说:

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

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

通过将数组的值传递给 listsize

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

于 2013-03-15T01:51:34.040 回答
1

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

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

于 2013-03-15T01:52:20.013 回答
0

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

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

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

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

于 2013-03-15T01:45:45.413 回答
0

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

更常用的语法是:for(int blah = 0; blah < max; 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< std::pair >::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 还包装了数组,因此您可以将其视为常规变量(因为向量就是其中之一)。

于 2013-03-15T01:50:20.737 回答
0

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

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

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

于 2013-03-15T01:56:08.533 回答