在使用指针和引用的一些新领域中,我试图通过引用将数组传递给使用指针的函数,但无论我尝试什么,我都会遇到错误,我确信问题很容易解决但我似乎无法绕过它,有人能看到我犯的错误吗?任何帮助都会有很长的路要走,谢谢
#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;
}
答案 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
的调用,因为永远不会使用堆内存。更确切地说,您可以删除上面的第一行。