【问题标题】:Passing an array by reference using pointers in C++使用 C++ 中的指针通过引用传递数组
【发布时间】:2013-03-24 17:49:54
【问题描述】:

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

#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;              
}

【问题讨论】:

  • 您遇到了什么错误?
  • @imulsion 当前代码告诉我 - 无法在分配中转换 double (*)[7]' to double*'
  • 你永远不能通过引用“通过传递指针”传递任何东西。您通过传递 reference 来通过引用传递事物。如果你传递一个指针,那么你就是通过指针传递它们。
  • 您是否遇到编译错误?我可以在以下行中看到一个错误: double * arrayPointer = new double[MAX_COUNTER]; arrayPointer = &temperaturesArray;
  • 代码中的大多数 cmets 都是不好的,因为它们不提供信息——它们只是解释你的代码。这样的 cmets 不提供任何价值,应该被删除。使用 cmets 提供代码中包含的信息。

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


【解决方案1】:

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

没有通用的“双精度数组”类型。但是有一个“7 个双精度数组”类型,一个“13 个双精度数组”类型,等等。

所以要将数组作为数组传递给函数,而不仅仅是作为指针传递给函数,您需要在函数的签名中编码精确的类型。

它不会是“一个接受数组的函数”,而是“一个接受大小为 7 的数组的函数”。

方法如下:

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

当然,如果数组大小不固定,你也可以模板化:

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

但实际上,您尝试做的事情根本不应该使用原始数组来完成。

使用标准库向量。

【讨论】:

    【解决方案2】:

    简单来说,换行

    arrayPointer = &temperaturesArray;
    

    arrayPointer = temperaturesArray;
    

    使代码编译。

    注意arrayPointerdouble* 类型,temperaturesArraydouble[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 的调用,因为堆内存从未使用过。更准确地说,您可以删除上面的第一行。

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2012-03-03
      • 1970-01-01
      • 2011-10-07
      • 2018-03-24
      • 1970-01-01
      相关资源
      最近更新 更多