使用动态内存分配和指针查找Max,Min,Avg

时间:2014-02-11 23:11:09

标签: c++ pointers

我正在学习指针,所以我试图实现这个简单的代码来查找学生成绩的Max,min和Avg。 我只能为 Max 找到 avg BUT ,而 Min 我得到了{{的第一个元素1}}。

这是我的代码如果你愿意,可以告诉我我的错误是什么

*p

}

5 个答案:

答案 0 :(得分:2)

如果*p大于当前maxmin,则只会推进指针。要么在每次迭代时前进(并备份原始状态),要么使用p[i]来获取迭代元素。

答案 1 :(得分:2)

请注意更改

for (int i = 0; i < x; i++)
    {
        if (min > *(p+i))
        {
            min = *(p+i);//changed

        }
    }

    for (int i = 0; i < x; i++)
    {
        if (max < *(p+i))
        {
            max = *(p+i);//changed

        }
    }

    for (int i = 0; i < x; i++)
    {
        sum += *(p+i);//changed

    }

答案 2 :(得分:2)

您的代码在许多级别上都是错误的。首先,看看如何初始化指针p,它应该指向包含int元素的数组的开头:

p = new int[x];

这一切都很好。但是,如果你现在看看第一个循环...

for (int i = 0; i < x; i++)
{
    if (min > *p)
    {
        min = *p;
        p++;
    }
}

你会注意到你继续递增p,这应该指向数组的开头。这样,当你运行第二个循环时,你不可能访问数组的每个元素,因为p不再指向数组的开头!因此,您通过从其边界访问数组来调用某些人称之为未定义行为的内容。

但是,您可以在循环中正确地引用数组,其中您实际将元素写入其中 - 使用行cin >> *(p + i);

此外,您应该始终记得delete new编辑的所有内容。但是,如果您丢失指向new返回的指针,您将永远无法成功delete它。

此外,如果您使用C ++进行编程,那么您应该避免使用原始指针,并且 - 如果您确实需要 - 将它们包装在unique_ptr内(如果您使用的是C ++ 11)。谈到“动态数组”时,std::vector通常是更好的方式。

答案 3 :(得分:1)

那是因为你正在做p++,因此“失去指针”。

在除{1}之外的每个for循环中,将*p更改为p[i],然后删除p++

此外,在功能结束时,请致电delete p

答案 4 :(得分:0)

您可以内联最大值,最小值和总和的计算:

int sum = 0;
int max = 0;
int min = 0;
for (int i = 0; i < x; i++)
{
    int g=0;
    cout << "Enter a grade: ";
    cin >> g;
    if (g > max)
        max = g;
    if (g < min)
        min = g;
    sum += g;
}

然后你不需要p = new int [x]