c - 如何在不获取大量随机输出的情况下正确求和数组的元素

标签 c arrays pointers

我写了两个函数并调用了main中的函数。

函数 1 – 我编写了一个返回 void 并接受 int *(指向整数数组的指针)或 int[] 和 int(用于大小)的函数。该函数需要将数组的所有元素初始化为非零值。

函数 2 – 我编写了另一个返回 int 并接受 const int *(指向整数数组的指针)或 int[] 和 int(表示大小)的函数。该函数应对数组的所有元素求和并返回总和。

在 main 中,我定义了一个大小为 5 的整数数组。在 main 中调用函数 1 来初始化数组的值。在 main 中调用函数 2 获取总和并将总和的值打印到控制台。

我的问题是程序运行但我们得到的总和的打印输出是一个很大(数百万)的随机数字,而不是预期的答案 15。任何可以帮助我们得到正确答案的人不胜感激

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma warning(disable: 4996)

void func1(int* ptr, int size);
int func2(const int* ptr, int size);

int main()
{
    int grid[5];

    func1(grid, 5);
    func2(grid, 5);
}

void func1(int* ptr, int size)
{
    *ptr = 1, 2, 3, 4, 5;
}

int func2(const int* ptr, int size)
{
    int sum;

    sum = ptr[0] + ptr[1] + ptr[2] + ptr[3] + ptr[4]; // *(ptr + 0); putting an asterisk makes it so that it changes the entire "ptr" value and the "[0]" value

    printf("\n\nThe sum of the integers in the array is %d.\n\n", &sum);
}

最佳答案

*ptr = 1, 2, 3, 4, 5;

做你认为它做的事。它实际上评估所有整数常量,但将 ptr[0] 设置为 1(有关更多详细信息,请参阅逗号运算符),将所有其他常量保留为某个任意值。

请注意,它评估*ptr = (1, 2, 3, 4, 5)(这将设置*ptr5) 但实际上正在评估 (*ptr = 1), 2, 3, 4, 5 - 这是可行的,因为像 42 这样的东西是实际上是一个有效的 C 语句,尽管不是很有用。

如果你试图将数组设置为增加值,只需使用类似的东西:

for (int i = 0; i < size; i++)
    ptr[i] = i + 1;

您可能还想在对值求和时这样做,因为它应该取决于传入的大小,而不是仅仅对五个值求和:

int sum = 0;
for (int i = 0; i < size; i++)
    sum += ptr[i];

此外,您打印出的值不是总和,而是包含总和的变量的地址(一个体面的编译器会警告您这一点)。您应该在 printf 中使用 sum 而不是 &sum

最后一点,func2 的签名表明您实际上应该返回总和,而不是仅仅打印它。所以我建议从该函数中删除 printf 并简单地执行以下操作:

return sum;

然后你可以将printf放入调用程序(main),如下所示:

int main(void)
{
    int grid[5];

    func1(grid, sizeof(grid) / sizeof(*grid));
    int sum = func2(grid, sizeof(grid) / sizeof(*grid));
    printf("The sum of the integers in the array is %d.\n\n", sum);
    return 0;
}

请注意 sizeof(grid)/sizeof(*grid) 的使用,它基本上是 grid 中数组元素的数量 - 这将允许您调整大小 grid 通过简单地将它的 一个 位置更改为 int grid[42] 之类的东西,并且所有代码仍然可以使用更新后的大小。

您的代码实际上不需要,但最好尽早养成良好的编程习惯(为您的函数使用更具描述性的名称也可能是个好主意)。

关于c - 如何在不获取大量随机输出的情况下正确求和数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45249762/

相关文章:

c++ - 使用堆上的成员初始化类内的类

c - OpenGL 投影、 View 和世界矩阵

arrays - MongoDB 从对象数组中的数组中删除一个项目

c - C 中带括号的指针

javascript - 添加和显示数组问题

java - JsonArray.getvaluesAs 不以 String.class 作为参数

c++ - 何时以及如何决定是否使用 Actor 阵容?

缓存与递归正交...解释一下?

根据用户输入的字符创建一个矩形

c - 理解 crypt() 在 MD5 情况下的输出