[英]c++ passing pointers to a function
我試圖用C ++創建一個控制台應用程序,提示用戶輸入一個浮點數,然后采用該數字並將整數部分和小數部分分開。
輸出示例如下:
請輸入一個浮點數:
800.589
整數部分是800,小數部分是.589
我的解決方案如下所示:
#include <iostream>
#include <cmath>
using namespace std;
void spliceAnyNumber (double anyNumber)
{
double integerPart = 1;
double fractionPart = 1;
double *pIntegerPart = &integerPart;
double *pFractionPart = &fractionPart;
fractionPart = fmod(anyNumber,1);
integerPart = anyNumber - fractionPart;
cout << "The integer part is " << *pIntegerPart << " and the fraction part is " << *pFractionPart << "\n";
cout << endl;
cout << "The address of *pIntegerPart is " << &integerPart << "\n";
cout << endl;
cout << "The address of *pFractionPart is " << &fractionPart << "\n";
cout << endl;
}
int main()
{
cout << "Please enter a floating point number: ";
double anyNumber = 0;
cin >> anyNumber;
cout << endl;
spliceAnyNumber(anyNumber);
system("Pause");
return 0;
}
我編寫了程序,但是還要求我將指針傳遞給函數並操縱解引用的值。 我嘗試在下面執行此操作,但是從編譯器返回了很多錯誤。
#include <iostream>
#include <cmath>
using namespace std;
void spliceAnyNumber (double *pAnyNumber)
{
double integerPart = 1;
double fractionPart = 1;
double *pIntegerPart = &integerPart;
double *pFractionPart = &fractionPart;
&fractionPart = fmod(&anyNumber,1);
&integerPart = &anyNumber - &fractionPart;
cout << "The integer part is " << *pIntegerPart << " and the fraction part is " << *pFractionPart << "\n"; *pFractionPart << "\n";
cout << endl;
cout << "The address of *pIntegerPart is " << &integerPart << "\n";
cout << endl;
cout << "The address of *pFractionPart is " << &fractionPart << "\n";
cout << endl;
}
int main()
{
cout << "Please enter a floating point number: ";
double *pAnyNumber = &anyNumber;
cin >> *pAnyNumber;
cout << endl;
spliceAnyNumber(*pAnyNumber);
system("Pause");
return 0;
}
添加指針在哪里出錯? 版本1有效,而版本2無效。
我已經注明了這一內聯。
#include <iostream>
#include <cmath>
using namespace std;
void spliceAnyNumber (double *pAnyNumber)
{
double integerPart = 1;
double fractionPart = 1;
double *pIntegerPart = &integerPart;
double *pFractionPart = &fractionPart;
&fractionPart = fmod(&anyNumber,1); // <- you should dereference pAnyNumber instead, and assign to fractionPart (i.e. "fractionPart = fmod(*pAnyNymber, 1);
&integerPart = &anyNumber - &fractionPart; // <- similar as above
cout << "The integer part is " << *pIntegerPart << " and the fraction part is " << *pFractionPart << "\n"; *pFractionPart << "\n";
cout << endl;
cout << "The address of *pIntegerPart is " << &integerPart << "\n";
cout << endl;
cout << "The address of *pFractionPart is " << &fractionPart << "\n";
cout << endl;
}
int main()
{
cout << "Please enter a floating point number: ";
double *pAnyNumber = &anyNumber; // <- you haven't declared an 'anyNumber' variable to take the address of
cin >> *pAnyNumber;
cout << endl;
spliceAnyNumber(*pAnyNumber);
system("Pause");
return 0;
}
您必須先聲明anyNumber
才能取消引用:
double *pAnyNumber = &anyNumber; // references an undeclared variable
傳遞給函數時只需取地址即可。 在此之前,您可以使用普通變量-無需指針:
double anyNumber;
cin >> anyNumber;
cout << endl;
spliceAnyNumber(&anyNumber);
此外,您在函數中使用了錯誤的運算符。 應該是這樣的:
*pFractionPart = fmod(*pAnyNumber,1);
*pIntegerPart = *pAnyNumber - fractionPart;
另一件事是語法無效: &variable = ...
字面意思是“變量的地址=”,這將導致double**
。
因此,您唯一要做的更改就是function參數,並對其進行訪問。 不需要函數內的所有那些指針。
&
運算符采用變量的地址,因此typeof(&anyNumber) == double**
。 您需要*
運算符。
您應該將double *pAnyNumber
讀為“當我應用*
運算符時,我得到一個double
”。 (您實際上得到了一個左值引用,但這並不會使您感到困惑,並且可能會使您感到困惑……)
您的main
功能是一團糟; 使其與原始版本相同,並更改spliceAnyNumber(pAnyNumber);
到spliceAnyNumber(&pAnyNumber);
。
我假設當您編寫anyNumber
您實際上的意思是pAnyNumber
。 如果您有指針
double* p;
您通過*p
而不是&p
取消引用。 前者給您double
,后者給您double**
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.