回想一下:指針是一個包含內存位置的整數。
此:
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)
儘管事實上你正在改變你傳入的內容,但我仍然說使用'const'引用。爲什麼你希望它在改變它們時使用文字?如果你想以這種方式工作,你需要重新考慮你想要做什麼,或者你得到的任何答案顯然不起作用,因爲這是不可能的,一個很好的理由。 – chris
您不通過引用傳遞指針...您通過引用傳遞*引用*。 :)如果你想通過指針傳遞,那就是它的名字。 – cHao