指针函数混淆C ++

时间:2013-06-06 17:15:13

标签: c++ pointers

我正在努力通过跳转到C ++,我刚刚到达指针部分,因此,我的第一面墙。我正试图解决这个问题:

问题13.4

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

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

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

但是我因为我不完全理解我不知道如何适应指针的问题。如果有人能为我愚蠢,我将不胜感激。

谢谢你的时间!

8 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

这意味着来电者为其他结果提供了空间 例如:

int function(int x, int y, int& res2)
{
  res2=x+y;
  return x*y;
}

答案 2 :(得分: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;
    }
};

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

答案 3 :(得分: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;
}

答案 4 :(得分:0)

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

示例:

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;
}

当我自己阅读代码时,我首先通过像这样大声读出符号来学习如何处理指针: * =“按指针指向...” &安培; =“......的内存地址”

希望这有帮助!

答案 5 :(得分: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函数,它只需要两个输入参数。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分: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个参数。