通过指针或引用C ++返回第二个值

时间:2015-03-22 16:28:19

标签: c++ string pointers

我已经搜索过,找不到任何与此类似的内容。虽然似乎确实存在相似之处。如果mod或管理员认为这是一个重复的主题,请让我知道哪一个,并在删除之前问我认为它可能有什么不同。

如果我在函数中返回一个int值,如何使用指针或引用参数间接返回第二个?我有一个我需要做的练习问题就是要求:

  

编写一个带两个输入参数的函数,并提供两个   将结果分离给调用者,这是乘法的结果   两个参数,另一个是添加它们的结果。既然你可以   直接从函数返回一个值,你需要第二个   通过指针或引用参数返回的值。

我还需要通过函数返回一个字符串指针。

  
      
  1. 编写一个功能,提示用户输入他或她的名字和姓氏,作为两个单独的值。这个功能应该   通过附加指针(或引用)将两个值都返回给调用者   传递给函数的参数。首先尝试使用   指针,然后是引用。
  2.   

我已经使用指针引用了这个,但是我在使用指针时遇到了麻烦。

#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. 修改您为练习1编写的程序,以便不是始终提示用户输入姓氏,而是仅在   调用者传入一个NULL指针作为姓氏。
  2.   

我该怎么做?

4 个答案:

答案 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);