2016-05-17 31 views
0

仍然是一般的编程noob。我知道这段代码不起作用,但为什么?使用指针的交换功能有什么问题?

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

应为:'void swap(int&num1,int&num2)'或'void swap(int * num1,int * num2)'并相应地调整您的代码。你的参数,因为它们是通过复制而不是引用或指针,所以你交换本地整数副本。 SO和互联网上有很多例子。 – Brandon

+2

相关,实际上,无论你从哪里调用,都应该简单地使用'std :: swap'。除非你在学术上被迫这样做,否则无需重新发明轮子。 – WhozCraig

+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

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

的原因是: 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

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

交换将现在的工作。

+0

我不是选民。代码很糟糕。你期望一个'swap'函数来做控制台I/O吗? 'printf'?就像'strlen'在控制台上输出字符串的长度一样,而不是返回。 – Ajay

+0

由于上述原因,我_am_ downvoter。你的'swap'会复制。重点是什么?为什么有人想调用一个函数,传入两个值,并将这些值以不同的顺序打印?等价函数就是'void swap(int n1,int n2){std :: cout << n2 <<“”<< n1 << std :: endl};' – Tas