Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 阵列简介_C_Arrays - Fatal编程技术网

C 阵列简介

C 阵列简介,c,arrays,C,Arrays,可能重复: 所以我刚开始使用数组,我需要创建3个函数来学习 int sumarray(int a[], int n); // a is an array of n elements // sumarray must return the sum of the elements // you may assume the result is in the range // [-2^-31, 2^31-1] int maxarraypos(int a[], int n); // a i

可能重复:

所以我刚开始使用数组,我需要创建3个函数来学习

int sumarray(int a[], int n);

// a is an array of n elements
// sumarray must return the sum of the elements
// you may assume the result is in the range
//    [-2^-31, 2^31-1]

int maxarraypos(int a[], int n);

// a is an array of n elements
// maxarraypos must return the position of
//   the first occurrence of the maximum
//   value in a
// if there is no such value, must return 0

bool lexlt(int a[], int n, int b[], int m);

// lexicographic "less than" between an array
//   a of length n and an array b of length m
// returns true if a comes before b in
//   lexicographic order; false otherwise
我将如何创建这些函数

对于
sumarray
,我感到困惑,因为数组存储的内容在一定长度内。为什么需要第二个参数
n

我如何测试一个使用数组的函数?我的想法是
sumarray([3],3)
。。是这样吗

对于
sumarray
,我很困惑,因为数组存储的内容在一定长度内,为什么需要第二个参数
n

您需要第二个参数来告诉您数组的长度。在C语言中,作为方法参数的数组不附带其长度。因此,如果您有一个将数组作为参数的方法,那么它无法知道长度,除非您也将其传递给该方法。这就是
n
的作用

还有,我该如何测试一个使用数组的函数,我的想法是
sumarray([3],3)
。。是这样吗

不,你可以说

int myArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
然后

int sum = sumarray(myArray, 10);
要解决所有这些问题,您需要循环(最好是
for
循环,我相信您的讲师提供了如何循环数组元素的示例)。除此之外,我不做你的家庭作业。问一些具体的、尖锐的问题,我很乐意考虑回答。

我很困惑,因为数组存储的内容在一定长度内, 为什么需要第二个参数n


因为你不知道具体的长度。如果在更改初始数组的长度时不想更改代码,则需要传递
n
,因为c语言通常不提供该信息。

当传递给函数时,数组会衰减为指针,指针本身不存储长度。第二个参数将存储数组中的元素数,因此,它看起来如下所示:

int values[] = { 16, 13, 78, 14, 91 };
int count = sizeof(values) / sizeof(*values);

printf("sum of values: %i\n", sumarray(values, count));
printf("maximum position: %i\n", maxarraypos(values, count));


n
是一个大小。它告诉您它正在传递一个
n
大小的数组。这是将数组传递给函数时最可靠的方法,因为
sizeof
不会返回正确的大小。这是非常基本的,在第一篇文档中您应该阅读关于C的内容,我不知道它是否属于堆栈溢出。@Chongshawei:叹气@崇绍伟,不,你对数组的理解一般是错误的。函数参数的声明看起来像是在声明数组的时候,但它们没有。@ 0A0D:为什么这个C问题是C++常见问题的一部分?请随时在会议上解释这一点。在那之前,我将删除FAQ标签。“当传递给函数时,数组将衰减为指针,而指针本质上不存储长度。”你显然是在和初学者交谈;这可能在他们的头上放大了。@Jason我想,但我不擅长为初学者重新措辞,对不起。@Jason:也许吧,但这是到目前为止我看到的唯一正确的解释。(
+1
来自我。)我宁愿让初学者要求澄清正确的答案,也不愿放弃简单但不正确的答案。我本来没有投反对票,但我现在会投反对票,因为你写的是错误的:数组的长度确实与数组相关:
sizeof(array)/sizeof(array[0])
。问题是数组很容易衰减为指向其第一个元素的指针,此时它们不再是数组,并且大小信息丢失。数组确实在类型中对其大小进行了编码。指针不会。如果这是为了不让初学者混淆细节,那么我不认为假装数组真的参与了
sumarray
,而实际上它们根本没有参与,最终会实现这一点。@sbi:对于传递给方法的数组参数,您不能使用您建议的方法。这是一个基本事实,也是每个正确编写的传递数组的C程序也传递数组长度的原因。数组已衰减为指针,您提出的技巧不起作用。我已经澄清了我的答案,但这并没有错,因为我正确地解释了为什么他必须将长度作为参数传递给该方法。我最初说“数组不附带长度”,意思是“作为参数的数组不…”@初学者北约:不,你很好。“对于maxarray,当它说要返回位置时,我要返回地址吗?”返回最大位置的索引。@Jason:我知道所有这些,我会全心全意地对所有答案进行投票,这些答案会像您现在的评论一样完整详细地解释它。对于array是这样的,但您不能将数组传递给C中的函数。@sbi,也有动态数组,所以如果我们说C存储数组的大小,这将是误导性的,现在我想起来了,C中有动态分配的数组吗?C++中有这样的兽,当你在C++中使用代码>删除[]/COD>一个动态创建的数组时,运行时系统“知道”数组的大小,并调用所有元素的析构函数。但在C语言中,您所能做的就是动态地分配一个内存块,然后将其视为某个数据类型。即使你把它当作一个数组来对待,对于运行时系统来说,它仍然只是一个内存块。是的,它通常被认为是错误的。但这就是新手的困惑所在,这就是为什么,当不是与经验丰富的C程序员讨论,而是向新手解释时,我坚持使用正确的术语。从这里的大多数答案中,新手都会错误地认识到这一点(公认的答案是“C中的数组不随其长度而变化”)。之后,为了取得进步,他们将不得不放弃学习。