double calculateAverage(double *a);
int main(){
double *dArray;
int n, m;
cout<<"\nplease enter the size of the array: ";
cin>>n;
dArray = new double[n];
for(m=0; m<n; m++){
cout<<"\nplease enter the number: ";
cin>>dArray[m];
}
*(dArray+m+1) = NULL; // i add this, so for the address after m+1 to be NULL
cout<<"\n the average of the array is : "<<calculateAverage(dArray)<<endl;
system("pause");
return 0;
}
double calculateAverage(double *a){
double total = 0;
int iCounter = 0;
while(*a!=NULL){ // here is the problem!! why it can't be NULL or 0 or empty? // edit from a to *a
total = total+*a;
a++;
iCounter++;
}
return total/(iCounter-1); //here edit, from iCounter to iCounter-1
}
我想知道为什么指针不指向NULL?谁能告诉我代码出错的地方?
谢谢。一个拼写错误,在数组分配循环块时应该是“n”而不是“nn”。
答案 0 :(得分:2)
你不能保证数组末尾有NULL
终结符,事实上除非你自己使用特定的标记(在某些情况下使用char*
),否则C ++中就没有这样的东西)。另外,在你的具体情况下,你所做的事情毫无意义。
指针是地址,你正在做的只是增加地址,它应该如何成为NULL
?从实际的角度来看,假设您将地址a == 0x12345678
传递给函数,当您执行++a
时,只需将它增加sizeof(double)
,这不会变为零(除非溢出时可能)。
因为C ++只是忘记数组并使用std::vector
(或者如果你真的想使用标准数组,则将长度作为参数传递给calculateAverage
函数)。
答案 1 :(得分:0)
使用new分配的数组的第一个元素的地址初始化指针。递增指针会将其移动到数组中下一个double的地址。 NULL是内存开头的地址,所以你的指针不会等于它,直到它遍历整个内存并被包裹起来。
您需要修改代码,以便迭代基于处理的元素数而不是指针引用的地址。
答案 2 :(得分:0)
我可以看到你有很多错误
*(dArray+m+1) = NULL
- &gt;如果您想将0放在数组的末尾,那么您应该使用*(dArray+m) = NULL
n
双打,并将null
写入n+1
(如果您打算使用n+1
,则分配n+1
...) (*a!=NULL)
之间的比较,这可能是错误的,因为在double中可能没有确切的0表示您需要确定正确的方法。 我建议将元素数量传递给方法或使用STL(向量)。
答案 3 :(得分:0)
#include<iostream>
#include<limits>
#include<cmath>
using namespace std;
double calculateAverage(double *a);
int main(){
double *dArray;
int n, m;
cout<<"\nplease enter the size of the array: ";
cin>>n;
dArray = new double[n];
for(m=0; m<n; m++){
cout<<"\nplease enter the number: ";
cin>>dArray[m];
}
//*(dArray+m+1) = NULL; // i add this, so for the address after m+1 to be NULL
*(dArray+m+1)=numeric_limits<double>::quiet_NaN( );// Jack gave the idea.
cout<<"\n the average of the array is : "<<calculateAverage(dArray)<<endl;
system("pause");
return 0;
}
double calculateAverage(double *a){
double total = 0;
int iCounter = 0;
\\while(*a!=NULL){ // here is the problem!! why it can't be NULL or 0 or empty? // edit from a to *a
while(!_isnan(*a)){ //Jack's idea.
total = total+*a;
a++;
iCounter++;
}
return total/(iCounter-1); //here edit, from iCounter to iCounter-1
}
我尝试根据@Jack的评论修改代码。其他人也提出了非常有价值的想法。非常感谢你们。
我认为代码现在被认为是可行的。