双数组C ++中的NULL(带示例)

时间:2013-10-14 03:21:20

标签: c++ arrays pointers

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”。

4 个答案:

答案 0 :(得分:2)

你不能保证数组末尾有NULL终结符,事实上除非你自己使用特定的标记(在某些情况下使用char*),否则C ++中就没有这样的东西)。另外,在你的具体情况下,你所做的事情毫无意义。

指针是地址,你正在做的只是增加地址,它应该如何成为NULL?从实际的角度来看,假设您将地址a == 0x12345678传递给函数,当您执行++a时,只需将它增加sizeof(double),这不会变为零(除非溢出时可能)。

因为C ++只是忘记数组并使用std::vector(或者如果你真的想使用标准数组,则将长度作为参数传递给calculateAverage函数)。

答案 1 :(得分:0)

使用new分配的数组的第一个元素的地址初始化指针。递增指针会将其移动到数组中下一个double的地址。 NULL是内存开头的地址,所以你的指针不会等于它,直到它遍历整个内存并被包裹起来。

您需要修改代码,以便迭代基于处理的元素数而不是指针引用的地址。

答案 2 :(得分:0)

我可以看到你有很多错误

  1. *(dArray+m+1) = NULL - &gt;如果您想将0放在数组的末尾,那么您应该使用*(dArray+m) = NULL
  2. 您分配了一组n双打,并将null写入n+1(如果您打算使用n+1,则分配n+1 ...)
  3. 你使用double和int (*a!=NULL)之间的比较,这可能是错误的,因为在double中可能没有确切的0表示
  4. 您需要确定正确的方法。 我建议将元素数量传递给方法或使用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的评论修改代码。其他人也提出了非常有价值的想法。非常感谢你们。

我认为代码现在被认为是可行的。