0

我正在通过 Jumping into C++ 工作,我刚刚到达指针部分,因此,我的第一面墙。我正在尝试解决这个问题:

问题 13.4

编写一个函数,它接受两个输入参数并向调用者提供两个单独的结果,一个是两个参数相乘的结果,另一个是它们相加的结果。由于您只能从函数中直接返回一个值,因此您需要通过指针或引用参数返回第二个值。

我真的不明白这个问题。我需要编写一个函数,例如:

int function(int x, int y){
    int addition = x + y;
    int multi = x * y;
}

但是我因为我不完全理解这个问题,所以我不知道如何适应指针。如果有人可以为我降低它,我将不胜感激。

谢谢你的时间!

4

8 回答 8

5

你可以试试

  int functionPtr(int x, int y, int* addition) {
    // As JustSid mentioned in the comment, it would be good to check the pointer first
    if (addition) {
      *addition = x + y;
    }
    return x * y;
  }

或者

  int functionRef(int x, int y, int& addition){
    addition = x + y;
    return x * y;
  }

当你想打电话给他们时

int x = 1;
int y = 2;
int addition1 = 0;
int multi = functionPtr(x, y, &addition1);

int addition2 = 0;
int multi = functionRef(x, y, addition2);
于 2013-06-06T17:18:26.443 回答
2

这意味着调用者为其他结果提供空间。
例子:

int function(int x, int y, int& res2)
{
  res2=x+y;
  return x*y;
}
于 2013-06-06T17:17:58.287 回答
1

有点跑题了,因为我不太喜欢问题 13.4 提出的问题……如果你愿意,你可以返回整个对象。考虑:

class AddMul {
public:
    int added;
    int multiplied;
};

AddMul function(int x, int y) {
    AddMul am;
    am.added = x + y;
    am.multiplied = x * y;
    return am;
}

当然,你可以考虑一些其他有趣的事情,比如 AddMul 类是否包含作为成员的函数?或者也许它直接是构造函数?

class AddMul {
public:
    int added;
    int multiplied;

public:
    AddMul(int x, int y) {
        added = x + y;
        multiplied = x * y;
    }

    int getAdd() const {
        return added;
    }

    int getMul() const {
        return multiplied;
    }
};

无论如何,要考虑的事情。

于 2013-06-06T17:30:51.907 回答
0
int function(int a, int &b){
   if (a == 0 || b == 0)
   {
     int bb = b;
     b = 0;
     return a+bb;
   }         
   b = (b*a);      
  return a+(b/a);
}

这可能很糟糕,但它确实只有 2 个参数。

于 2013-06-06T18:19:39.620 回答
0

这不是本书要求您做的,但值得了解提供指针/引用以从函数返回多个结果的替代方法。

std::pair<int, int> function(int x, int y)
{
    std::pair<int, int> p;
    p.first = x + y;
    p.second = x * y;
    return p;
}
于 2013-06-06T17:25:11.543 回答
0

我对 C++ 非常生疏,所以如果我的回答有点偏离,请原谅我,但基本上指针是给出一些数据地址的变量,而不是数据本身。这意味着您可以将整数的地址传递给函数,以允许该函数跟随指针并将数据存储在该整数的内存位置。要获取变量或对象的地址,请使用与号 (&),并使用星号 (*) 跟随指针

例子:

int main(void){
  int x = 2;
  int y = 3;
  int multiplicationResult = 0;
  int additionResult = twoOperations(x, y, &multiplicationResult); // The ampersand allows us to pass in a pointer to the memory address of multiplicationResult, rather than the value currently stored in it (0)
  // additionResult will now be 5
  // multiplicationResult will now be 6 - our function was able to store the result in memory using the pointer so we didn't need to use an assigment statement.
}

int twoOperations(int x, int y, int *multiResult){
  int addition = x + y;
  *multiResult = x * y; // The asterisk basically means "follow this pointer and store the result in that memory location."
  return addition;
}

在给自己阅读代码时,我首先学会了如何处理指针,方法是像这样大声朗读这些符号: * = "Follow the pointer to..." & = "The memory address of..."

希望这可以帮助!

于 2013-06-06T17:26:05.480 回答
0

这是正文的重要部分:

编写一个函数,该函数接受两个输入参数并向调用者提供两个单独的结果[...]

这意味着调用者sumAndProduct可以调用它来接收 sum 和 product,这个虚构的语法应该传达以下含义:

int main() {
    int sum;
    int product

    (sum, product) = sumAndProduct(29, 541);

    printf("the sum of the two numbers is %d and the product is %d\n", sum, product);
}

但是,C 中不存在这样的语法。该练习要求您找到一种使用现有 C 语法的方法(提示:函数参数的类型可以是int*int&。)

编辑:您可以有一个带有 4 个参数的函数,其中两个是输入参数,两个是输出参数;因此有一个 4-arg 函数,该函数恰好接受两个输入参数。

于 2013-06-06T17:29:39.150 回答
0

由于问题是“接受两个输入参数的函数”,因此函数中不能有 3 个参数。实现此目的的一种方法是返回指向数组的指针。所以

int * function(int x, int y) {
    int * res = new int[2];
    //Perform computation
    //res[0] = ...
    //res[1] = ...
    return res;
}

请注意,您应该在调用函数中释放数组内存。

于 2013-06-06T17:31:15.587 回答