2012-11-17 117 views
1

爲什麼這個程序只適用於初始化a和b。 我想通過它而不用初始化a和b,例如:通過引用通過指針

numChange(10,15);

這可能嗎?

#include <iostream> 
using namespace std; 
void numChange(int *x,int *y) 
{ 
    *x = 99; 
    *y = 77; 
} 

int main() 
{ 
    numChange(10,15); 
    //int a=10; 
    //int b=15; 
    //numChange(&a,&b); 
    cout<<a<<" , "<<b<<endl; 

    return 0; 
} 
+0

儘管事實上你正在改變你傳入的內容,但我仍然說使用'const'引用。爲什麼你希望它在改變它們時使用文字?如果你想以這種方式工作,你需要重新考慮你想要做什麼,或者你得到的任何答案顯然不起作用,因爲這是不可能的,一個很好的理由。 – chris

+0

您不通過引用傳遞指針...您通過引用傳遞*引用*。 :)如果你想通過指針傳遞,那就是它的名字。 – cHao

回答

3

因爲你定義了你的函數來接收指針,但是當你調用它的時候,你正試圖傳遞一個int。

編譯器正在檢測內存地址,並且您正在嘗試傳遞常量。

它沒有任何意義,你正在嘗試做一些事情:10 = 99; 15 = 77; ?

numChange(10,15); 
    //int a=10; 
    //int b=15; 

看來你在跳躍a = 10 = 99和b = 15 = 77;

如果這是可能的,這意味着我永遠不會(在調用numChange(10,15);之後)變量實際上具有值10,因爲10是「指向」99(不是)。

+0

謝謝你非常有幫助 –

+0

Np,你好。 – dreamcrash

2

回想一下:指針是一個包含內存位置的整數。

此:

int a, b; 
... 
a = b; 

副本存儲在針對「B」保留用於 「A」保留的存儲器位置中的存儲器位置中的整數。

此:

int *a, b; 
... 
a = &b; 

存儲位置 'A' 'B' 的。與此以下它:

*a = 42; 

將存儲在42中存儲「A」的存儲器位置,這是 變量「B」。

現在,我們來看看你的代碼。這:

void numChange(int *x,int *y) 

告訴編譯器「numChange」將有兩個 指針調用 - 也就是內存地址。這一部分:

*x = 99; 
*y = 77; 

然後存儲在 'X' 和 'Y' 給出的位置兩個整數。

當你撥打:

numChange(10,15); 

的參數都是整數,而不是存儲位置。但是,在 引擎蓋下,內存位置也是整數,因此編譯器會將參數轉換爲指針。實際上,它這樣做:

numChange((int *)10, (int*)15); 

(它應該發出警告,當發生這種情況,因爲它幾乎從來沒有 一個好主意,但它做)

基本上,你的電話'numChange'告訴它,在內存地址10和15處有整數 變量,而'numChange'在 處進行並將整數存儲在這些存儲位置。由於不是 變量(我們知道)在這些位置,實際上這個代碼 會覆蓋某些其他數據。

同時,該代碼:

int a=10; 
int b=15; 
numChange(&a,&b); 

創建兩個整數變量,然後通過在 存儲器爲 'numChange' 它們的地址。順便說一句,你實際上並不需要初始化他們的 。這工作太:

int a, b; 
numChange(&a,&b); 

最重要的是這兩個變量創建( 留出RAM爲他們的編譯器)和它們的位置,然後傳遞到 「numChange」。

(一一旁:我治療變量總是存儲在RAM 它是安全的這樣想他們,但現代的編譯器將嘗試 它們存儲在CPU寄存器儘可能性能 原因,需要時將它們複製回RAM)

+0

非常感謝,非常清楚的解釋 –