2013-01-06 73 views
0

可能重复:
Swapping objects using pointers交换指针

我知道该怎么做使用指针交换,但是呢,如果我尝试这样一种不同的方法:

/* Pointers */ 
#include <stdio.h> 
int main() 
{ 
    int a=4,b=6; 
    swap(&a,&b); 
    printf("A is %d, and B is %d\n",a,b); 
    return 0; 
} 

int swap(int *a, int *b) 
{ 
    int *temp; 
    temp = a; 
    a = b; 
    b = temp; 
    return 0; 
} 

它不起作用。基本上交换功能正在改变地址,如'a'现在有'b'的地址,反之亦然。如果我打印出交换功能的值,它给出交换值,但它不反映在主功能。任何人都可以告诉我为什么?

+0

它是C还是C++?我会推荐两种不同的东西。 – chris

+0

[为什么这些交换函数的行为不同?](http://stackoverflow.com/questions/4330929/why-do-these-swap-functions-behave-differently) – DCoder

+0

没有接受的答案! –

回答

8

由于

交换函数正在改变地址,如“A”现在有“B”的地址,并且反之亦然

是不正确的。它不会改变他们的地址(这绝对没有任何意义)。该函数改变指针的值 - 这些指针是地址的副本,而这些指针,因为它们是函数参数,对于函数来说是本地的。你所要做的是:

int swap(int *a, int *b) 
{ 
    int temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; 
    return 0; 
} 

或者你可以使用(只在C++)引用,就像这样:

int swap(int &a, int &b) 
{ 
    int temp; 
    temp = a; 
    a = b; 
    b = temp; 
    return 0; 
} 

,并调用它没有 AddressOf运算符:

int a = 4, b = 6; 
swap(a, b); 

但是,如果这是一个实际的实现,而不是“写一个交换功能”风格的作业,那么你应该使用std::swap()function<algorithm>

+2

此外,还有'std :: swap'。 – chris

+0

@chris是的,我也加了一个。 – 2013-01-06 07:58:17

+0

好吧..让我明白一件事..如果我在主函数内部声明一个指针,并将任何变量的地址赋值给那个指针,那么这个指针也会保存地址的副本。 –

1

交换中的'a'和'b'不是主体中的'a'和'b'。在交换中,这些是指针。如果要交换a,b指向的值,则需要:

int swap(int* pa, int *pb) 
{ 
    int temp; 
    temp = *pa; 
    *pa = *pb; 
    *pb = temp; 
    return 0; 
} 

注意我使用的是更合适的变量名称。此外,你需要分配temp(vs分配指向temp)。

3

如果您只是使用标准方法将它们作为inout,您将收到变量的COPY,而不是实际变量。然而,当你通过一个*variable你给它一个指向实际变量的变量。然后可以使用交换来设置内存位置,因为内存位置的副本仍然相同。

因此,尝试此代码为您的功能:

int swap(int *a, int *b) 
{ 
    int tmp; 
    tmp = *a; 
    *a = *b; 
    *b = tmp; 
    return 0; 
} 
+0

我正在寻找的解释。谢谢! –

+0

@UnderDog没问题,很高兴帮助。出于好奇,这是一门课程? CS50? – 2013-01-06 08:32:31

0

您可以尝试使用:

int swap(int*& a, int*& b) 
{ 
    int *temp; 
    temp = a; 
    a = b; 
    b = temp; 
    return 0; 
} 

需要注意的是堆栈地址不能移动,所以你需要一个不同的主:

int main() 
{ 
    int a=4,b=6; 
    int *A = &a; 
    int *B = &b; 

    swap(A, B); 
    printf("A is %d, and B is %d\n",*A, *B); 
    return 0; 
}