我已经搜索过,找不到任何与此类似的内容。虽然似乎确实存在相似之处。如果mod或管理员认为这是一个重复的主题,请让我知道哪一个,并在删除之前问我认为它可能有什么不同。
如果我在函数中返回一个int值,如何使用指针或引用参数间接返回第二个?我有一个我需要做的练习问题就是要求:
编写一个带两个输入参数的函数,并提供两个 将结果分离给调用者,这是乘法的结果 两个参数,另一个是添加它们的结果。既然你可以 直接从函数返回一个值,你需要第二个 通过指针或引用参数返回的值。
我还需要通过函数返回一个字符串指针。
- 编写一个功能,提示用户输入他或她的名字和姓氏,作为两个单独的值。这个功能应该 通过附加指针(或引用)将两个值都返回给调用者 传递给函数的参数。首先尝试使用 指针,然后是引用。
醇>
我已经使用指针引用了这个,但是我在使用指针时遇到了麻烦。
#include <iostream>
using namespace std;
string userName(string user_first_name, string user_last_name);
int main()
{
string user_first_name;
string user_last_name;
cout << "Program for taking in user's full name\n";
cout << userName(user_first_name, user_last_name);
}
string userName(string user_first_name, string user_last_name)
{
cout << "Please provide your first name: ";
cin >> user_first_name;
cout << "Please provide your last name: ";
cin >> user_last_name;
string full_name = user_first_name + " " + user_last_name;
return full_name;
}
每当我尝试将这些字符串变量用作指针时,我会收到错误消息,说我无法将字符串转换为字符串*,或者我收到错误消息,说我无法将字符串*转换为字符串** 。
至于另一个,这是我的代码:
#include <iostream>
using namespace std;
int* pointerMath();
int main()
{
cout << "Let's do some math!\n";
pointerMath();
}
int* pointerMath()
{
int value1;
int value2;
cout << "Provide the first number: ";
cin >> value1;
cout << "Provide the second number: ";
cin >> value2;
int *multiplication_result = value1 * value2;
int *addition_result = value1 + value2;
cout << "The numbers added together are: " << *addition_result << '\n';
cout << "The numbers multiplied by each other are: " << *multiplication_result << '\n';
return multiplication_result;
}
每当我运行它时,它总是在获得两个输入值后立即崩溃,并且我得到错误代码255.
编辑:
根据这个问题的规范,我还必须进一步修改字符串名称程序:
- 修改您为练习1编写的程序,以便不是始终提示用户输入姓氏,而是仅在 调用者传入一个NULL指针作为姓氏。
醇>
我该怎么做?
答案 0 :(得分:1)
要用指针做,你必须引入指针,即
改变这个:
string userName(string user_first_name, string user_last_name);
指向(注意string*
指针参数):
string userName(string* user_first_name, string* user_last_name);
此外,当你起诉cin
时,你必须使用(*pointer)
语法取消引用指针,例如:
string userName(string* user_first_name, string* user_last_name)
{
cout << "Please provide your first name: ";
cin >> (*user_first_name); // <-- dereference pointer
cout << "Please provide your last name: ";
cin >> (*user_last_name); // <-- dereference pointer
string full_name = (*user_first_name) + " " + (*user_last_name);
return full_name;
}
在main()
中,您应该使用&
运算符的地址传递变量的地址:
int main()
{
string user_first_name;
string user_last_name;
cout << "Program for taking in user's full name\n";
// Use & to get address of (pointers) to first and last name
cout << userName(&user_first_name, &user_last_name);
}
现在我向您展示了一些示例代码,您应该能够为其他情况使用类似的编码模式。
答案 1 :(得分:1)
由于您可以直接从函数中返回一个值,因此您可以使用 需要通过指针或引用返回第二个值 参数。
这非常误导。确实,您在技术上只返回一个值,但没有什么能阻止您返回内部包含两个值的自定义类型。这种方法通常优于引用或指针,应该是默认选择:
struct Value
{
int x;
int y;
};
Value GetValue()
{
return { 1, 2 };
}
我已经使用指针引用了这个,但我已经拥有了 用指针做错了。
您不应该首先使用指针。不是直接指针而不是指针的引用。参考就足够了。
string userName(string user_first_name, string user_last_name);
这些字符串参数是副本。该函数将对参数的副本进行操作,并且外部的原始字符串将保持不变。
每当我尝试将这些字符串变量用作指针时,我就会得到一个 错误说我无法将字符串转换为字符串*,或者我收到错误 说我不能将字符串*转换为字符串**。
因为指向某个东西的指针不能隐式转换为某个东西,反之亦然(如果&#34;某些东西&#34;本身就是指针)也是如此。
只需使用参考:
string userName(string& user_first_name, string& user_last_name);
int *multiplication_result = value1 * value2;
value1 * value2
的结果是int
。您不能只使用int
并将其用作指针。您的代码甚至不应该编译,但会失败并显示error C2440: 'initializing' : cannot convert from 'int' to 'int *'
之类的错误消息,除非您使用的是古老的编译器或使用错误的设置调用它。
答案 2 :(得分:0)
对于第一个问题,您需要使用&
来传递字符串值。我认为比使用传递指针更好理解。
你也可以像这样传递指针:
#include
using namespace std;
string *userName(string user_first_name, string user_last_name);
int main()
{
string user_first_name;
string user_last_name;
cout << "Program for taking in user's full name\n";
cout << *(userName(user_first_name, user_last_name));
}
string* userName(string user_first_name, string user_last_name)
{
cout << "Please provide your first name: ";
cin >> user_first_name;
cout << "Please provide your last name: ";
cin >> user_last_name;
string *full_name = new string;
*full_name = user_first_name + " " + user_last_name;
return full_name;
}
int * multiplication_result是一个指针,它需要与一个值绑定。之后,您可以将其指向int值。 你可以通过这种方式传递价值:
#include <iostream>
using namespace std;
int* pointerMath();
int main()
{
cout << "Let's do some math!\n";
cout<<*(pointerMath()) <<endl;
}
int* pointerMath()
{
int value1;
int value2;
cout << "Provide the first number: ";
cin >> value1;
cout << "Provide the second number: ";
cin >> value2;
int *multiplication_result = new int;
*multiplication_result = value1 * value2;
int addition_result = value1 + value2;
cout << "The numbers added together are: " << addition_result << '\n';
cout << "The numbers multiplied by each other are: " << *multiplication_result << '\n';
return multiplication_result;
}
答案 3 :(得分:0)
编写一个带两个输入参数的函数,并提供两个 将结果分离给调用者,这是乘法的结果 两个参数,另一个是添加它们的结果。既然你可以 直接从函数中只返回一个值,你需要第二个 通过指针或引用参数返回的值。
int multiplyAndAdd(int a, int b, int& sum){
sum = a+b;
return a*b;
}
调用它是这样的:
int sum=0;
int multiply = multiplyAndAdd(2,3,sum);
我赞成使用引用而不是指针。在后一种情况下,它会是这样的:
int multiplyAndAdd(int a, int b, int* sum){
*sum = a+b; //--> probably a null check is needed
return a*b;
}
然后这样打电话:
int sum=0;
int multiply = multiplyAndAdd(2,3,&sum);
字符串练习几乎相同: 参考文献:
void returnstrings(string& s1, string& s2){
//whatever here you just assign s1 and s2
}
称呼它:
string firstName;
string lastName;
returnstrings(firstName,lastName);
指针:
void returnstrings(string* s1, string* s2){
//whatever here you just assign *s1 and *s2
}
称呼它:
string firstName;
string lastName;
returnstrings(&firstName,&lastName);