我正在学习指针,所以我试图实现这个简单的代码来查找学生成绩的Max,min和Avg。 我只能为 Max 找到 avg BUT ,而 Min 我得到了{{的第一个元素1}}。
这是我的代码如果你愿意,可以告诉我我的错误是什么
*p
}
答案 0 :(得分:2)
如果*p
大于当前max
或min
,则只会推进指针。要么在每次迭代时前进(并备份原始状态),要么使用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]