2013-04-12 66 views
0

我正嘗試使用指向int的指針,如下面的程序。但是我沒有得到預期的產出。指向int的指針的錯誤輸出

輸出:

9 5 
5 9 

期待:

9 5 
9 5 

代碼:

#include <iostream> 
using namespace std; 

void swap (int *& a, int *&b) 
{ 
    int *t = a; 
    a = b; 
    b = t; 
} 

int main() 
{ 
    int a = 5, b = 9;  
    int *p = &a; 
    int *q = &b; 

    swap (p, q); 
    cout << *p << " " << *q << endl; 
    cout << a << " " << b << endl; 

    return 0; 
} 

爲什麼我的期望錯了嗎?我認爲這個參考不是目標變量的其他名稱。

回答

2

您交換指針,而不是值。你的期望是錯誤的。

+0

此外,OP應該嘗試理解**爲什麼**引用或指針需要交換兩個對象,並且他不應該僅僅假設「因爲我在SO上看到它而需要它」等等。 – 2013-04-12 11:44:12

0

一般而言,您交換兩個指針而不是它們指向的內容。

也許你的功能令你感到困惑,因爲你正在調用值a和b。你的函數交換兩個指針,第一個指向第二個指向的地方,第二個指向第一個指向的地方。

p先前指向aqb。現在pbqa這樣你的輸出爲9 5 5 9

,我們在您swap函數的引用。這些是對指針的引用,因此函數範圍中的ab變爲傳入參數的別名,即pq,並因此修改pq(指向其他地方)。

0

在你的情況,你交換指針(而不是值)。由於您正在交換指針,因此ab中的實際保持不變。因此,如果您打印a的值,則會得到5,而當您打印b時,您會得到9

0

我領導該參考沒什麼只是一個目標 變量

是其他名稱,目標在你的情況變量是變量的指針,而不是變量。因爲你在函數聲明中使用*。然後,你交換指針而不是值。

使用這些方法之一:

void swap(int &a, int &b) 
{ 
    int t=a; 
    a=b; 
    b=t; 
} 
// ... 

int a=5,b=9;   
swap(a,b); 

void swap(int *a, int *b) 
{ 
    int t=*a; 
    *a=*b; 
    *b=t; 
} 
// ... 

int a=5,b=9;   
swap(&a,&b); 
1

你交換指針的值。

看看這個例子:

首先,p指向在aq指向在b

p   a 
+---+  +---+ 
+ ------> | 5 | 
+---+  +---+ 

    q   b 
+---+  +---+ 
+ ------> | 9 | 
+---+  +---+ 

你換pq後,qa指向,並p是指着b

q   a 
+---+  +---+ 
+ ------> | 5 | 
+---+  +---+ 

    p   b 
+---+  +---+ 
+ ------> | 9 | 
+---+  +---+ 

ab仍然有其舊值。