2013-07-02 185 views
11

任何人都可以告訴我指針和呼叫引用之間的確切區別。其實這兩種情況都發生了什麼?呼叫引用和指針呼叫之間的區別

如:

調用由參考:

void swap(int &x, int &y) 
{ 
    int temp; 
    temp = x; /* save the value at address x */ 
    x = y; /* put y into x */ 
    y = temp; /* put x into y */ 

    return; 
} 

swap(a, b); 

調用由指針:

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

    swap(&a, &b); 
+3

在java中沒有指針。 –

+2

爲什麼標記* java *? – Nawaz

+0

這個問題與Java無關。 –

回答

13

這兩種情況完全一樣。

但是,小不同的是,那引用是永遠不能爲null(和內部功能你肯定的是,它們在引用有效的變量)。另一方面,指針可能是空的或可能指向內存中的無效位置,導致AV。

+0

在以下調用中'x'的引用是什麼:'swap(*(int *)0,y)'? –

+0

@ValeriAtamaniouk這將是未定義的行爲。 – juanchopanza

+0

@ValeriAtamaniouk什麼是重要的,這將是一個未定義的行爲*甚至在進入函數*之前。 – Spook

0

在你的榜樣,沒有任何區別。

在C++中,引用是使用指針實現的。

編輯:對於那些誰相信引用不能爲NULL:

int calc(int &arg) 
{ 
    return arg; 
} 

int test(int *arg) 
{ 
    return calc(*arg); 
} 

猜測,這將是對test(0)結果呢?

+3

...除了指針可以是NULL並且引用不能... – trojanfoe

+0

@trojanfoe引用可以指向NULL。雖然這不是一個普遍的情況。 –

+0

請顯示該代碼。 – trojanfoe

3

語義上這些調用具有相同的結果;引擎蓋下的引用是用指針實現的。

使用引用和指針之間的重要區別是引用你有更少的繩子掛在你自己。引用總是指向「某些東西」,指針可以指向任何東西。例如,它完全有可能做這樣的事情

void swap(int *x, int *y) 
{ 
    int temp; 
    temp = *x; /* save the value at address x */ 
    ++x; 
    *x = *y; /* put y into x */ 
    *y = temp; /* put x into y */ 

    return; 
} 

現在這個代碼可以做任何事,死機,運行,有猴子飛出你的不一,任何東西。

如有疑問,請更換參考文獻。它們是指針上更高,更安全的抽象級別。

0

您的代碼是C++代碼。在Java中沒有指針。兩個例子都是一樣的,功能上沒有區別。

0

我不知道爲什麼這被標記爲jave,因爲沒有指針。但是,對於這個概念,如果您正在處理value屬性,則可以互換使用指針和引用。例如i = 4或* i = 4。使用指針的優點是你可以操縱地址本身。有時你需要修改地址(指向別的東西......),這是指針不同以供參考;指針允許你直接在地址上工作,參考不會