这个使用指针的交换函数有什么问题?

时间:2016-05-17 05:18:00

标签: c++ pointers

一般来说仍然是编程的菜鸟。我知道这段代码不起作用,但为什么呢?

void swap(int num1, int num2)
{ 
  int* p_first =& num1;
  int* p_sec =& num2;
  *p_first = num1;
  *p_sec = num2; 
}

3 个答案:

答案 0 :(得分:2)

该函数按值获取其参数,这意味着该函数仅在num1num2的临时副本上运行。该函数修改这些值,然后当它返回时,它会抛弃临时值,并保留未更改的实际值。

解决这个问题的惯用C ++方法是通过引用传递参数而不是值。

void swap(int &num1, int &num2) {
   auto temp = num1;
   num1 = num2;
   num2 = temp;
}

int x = 5, y = 7;
swap(x, y);

或者,您可以通过指针传递参数。这是惯用的C方式(因为C没有引用)。缺点是它强制调用者的代码传递其参数的地址,而不是参数本身。

void swap(int *num1, int *num2) {
   int temp = *num1;
   *num1 = *num2;
   *num2 = temp;
}

int x = 5, y = 7;
swap(&x, &y);

当然,要交换两个数字,最佳方式是不重新发明轮子,而是使用已经为您编写的std::swap

int x = 5, y = 7;
std::swap(x, y);

答案 1 :(得分:1)

你的功能什么都不做,它看起来像一个无输出功能。

原因是: num1num2是堆栈变量,您将其地址分配给p_firstp_sec,它们也是堆栈变量。每次执行代码时,都会更改堆栈变量的地址。

如果您想交换num1num2,为什么要将这些值分配给另外两个变量(这没有任何意义)。

至少你应该这样想交换它们:

temp = num1
num1 = num2
num2 = temp

并且因为如果你这样声明,C ++只会传递值来运行

void swap(int num1, int num2)

因此您需要使用指针或引用来执行此操作(可以轻松搜索详细实现):

void swap(int* num1, int* num2) //pointer parameter
void swap(int& num1, int& num2) //reference parameter

答案 2 :(得分:-2)

1 - 在交换函数中,您使用按值调用,因此无法将结果返回给调用函数。

2 - 实现下面给出的功能 - >

void swap(int num1, int num2) { 
    int temp;
    int* p_first =&num1;
    int* p_sec =&num2;
    temp = *p_first;
    *p_first = *p_sec;
    *p_sec = temp;
    printf("\n %d %d \n",num1,num2);
}

Swap现在可以使用。

相关问题