使用C ++中的指针通过引用传递数组

时间:2013-03-24 17:49:55

标签: c++ pointers reference pass-by-reference

在使用指针和引用的一些新领域中,我试图通过引用将数组传递给使用指针的函数,但无论我尝试什么,我都会遇到错误,我确信问题很容易解决但我似乎无法绕过它,有人能看到我犯的错误吗?任何帮助都会有很长的路要走,谢谢

#include<iostream>
#include<cmath>
#include <iomanip>
#include <cstdio>   
#include <cstdlib>
#include <new>

using namespace std;

//Inline function 
inline double getFahrenheit(double theCelsius)
{ 
//Convert the celcius to farenheit   
return (theCelsius + 32) * 5 / 9;  
}

void outputWeather(double *temperaturesArray, const string WEEK_DAY_NAMES[], const     double MAX_NUMBER)
{
     //this is a counter that will increment through the days and various 
     int counter;
     //reset the counter to 0 so we can use it again       
     counter = 0;
     //print a header       
     cout << "THIS WEEKS TEMPERATURE REPORT " << endl;
     //print a divider 
     cout << "=============================" << endl;
     //while the counter is less than 7 repeat again
     while(counter < MAX_NUMBER)
     {
         //print out the temperatures by day          
         cout << WEEK_DAY_NAMES[counter] << "     " << temperaturesArray[counter] << "\370C    " << getFahrenheit(temperaturesArray[counter]) <<"\370F    "<< endl;
         //increase the counter by 1
         counter +=1;  
     }
}

//Function that will determine whether or not the value the user entered was numeric     and within the range
double checkValidation(string weekDay)
{
 //Create a variable to store a valid number
 double validNumber;

 //This will hold the value for the lowest  
 const double MIN_NUMBER = 1;
 //This will hold the value for the highest temperature
 const double MAX_NUMBER = 365;
 //This will hold the value for the valid number that the user will eventually enter 
 validNumber = 0.0;

 //This will alert the user to enter a temperature for that day of the week
 cout << "Please enter the temperature for " << weekDay << endl;
 //This will take in teh value the user entered for teh temperature 
 cin >> validNumber; 

     //If the text the user entered was not numeric start again             
 if(cin.fail())            
 {
     //C++ built in methods for clearing the cin                     
     cin.clear();              
     fflush(stdin);

     //alert the user what they typed was wrong 
     cout << "invalid input. please try again and enter a numeric value" << endl; 
     //pass in the weekeday and start over
     checkValidation(weekDay);                     
 } 
 else 
 {
     //if teh number falls outside the range
     if(validNumber < MIN_NUMBER || validNumber > MAX_NUMBER)
     {
         //Alert the user that it was outside the range           
         cout << "invalid input. please try again and enter a value between -90 and 60" << endl; 
         //pass in the weekday and try again          
         checkValidation(weekDay);
     }

 }
 //return the valid number    
 return validNumber;  

}


int main()
{
    //this is a counter that will increment through the days and various 
    int counter;
    //a constant to hold the variable for the number of days
    const int MAX_COUNTER = 7;
    //an array that will hold all the days of the week
    const string WEEK_DAY_NAMES[] = 
    { 
          "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 
    };

    //this will hold all of teh temperatures
    double temperaturesArray[MAX_COUNTER]; 
    //start the counter off at 0      
    counter = 0; 

    //begin telling the user to enter temperatures by printing a header
    cout << "Please enter the temperature for every day of the week " << endl;
    //while the counter is less than 7 we will repeat
    while(counter < MAX_COUNTER)
    {                                                       
    //add temperature to the array 
    temperaturesArray[counter] = checkValidation(WEEK_DAY_NAMES[counter]); 
    //add 1 to the counter            
    counter +=1;                     

    }

    double * arrayPointer = new double[MAX_COUNTER];

    arrayPointer = &temperaturesArray;

    outputWeather(arrayPointer, WEEK_DAY_NAMES, MAX_COUNTER);       

system("PAUSE");
return 0;              
}

2 个答案:

答案 0 :(得分:5)

在C ++中,数组的大小被编码为其类型。

没有一般的“双打阵列”类型。但是有一个“7个双打阵列”类型和一个“13个双打阵列”类型,依此类推。

因此,要将数组作为数组传递给函数,而不是简单地作为指针传递给函数,您需要在函数的签名中对精确类型进行编码。

它不是“一个采用数组的函数”,而是“一个采用7号数组的函数”。

这样做的方法如下:

void f(double (&arr)[7]);

当然,如果数组大小未修复,您可以对其进行模板化:

template <size_t N>
void f(double (&arr)[N]);

但实际上,你要做的事情根本不应该使用原始数组。

使用标准库载体。

答案 1 :(得分:0)

简而言之,更换行

arrayPointer = &temperaturesArray;

arrayPointer = temperaturesArray;

使代码编译。

请注意,arrayPointer的类型为double*,而temperaturesArray的类型为double[MAX_COUNTER]MAX_COUNTER = 7)。因此,您可以将arrayPointer分配给double的地址,但不能将arrayPointer分配给double[MAX_COUNTER]的地址。这就是原始代码试图做的事情,因此无法编译。

另一方面,double[MAX_COUNTER]的每个元素都是double。特别是,第一个元素是double,您可以将其地址分配给arrayPointer

arrayPointer = &temperaturesArray[0];

上面的解决方案只是这条线的同步糖。实际上,当您将类型为“ T型数组”的对象(例如double[MAX_COUNTER])分配给“类型为T 的指针”时,编译器会执行所谓的数组到指针转换,这意味着将第一个数组元素的地址赋给指针。

现在对您的代码(使用提供的修补程序)进行一点评论,具体来说,以下几行:

double * arrayPointer = new double[MAX_COUNTER];
arrayPointer = temperaturesArray;

上面的第一行分配堆内存来存储MAX_COUNTER类型double对象的数组。然后将此数组的第一个元素的地址分配给arrayPointer

然后,以下行将arrayPointer重新分配给temperaturesArray的第一个元素的地址。因此,堆分配数组的第一个元素的地址将丢失,您不能再delete它。请记住,对new的每次调用都必须通过调用delete进行匹配(否则会导致内存泄漏)。但是,在这种特殊情况下,最好的办法是不要调用delete。实际上,你应该消除对new的调用,因为永远不会使用堆内存。更确切地说,您可以删除上面的第一行。