2013-01-06 74 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; 
}