讓我們通過你的例子:
void showInt(int* numbers) // (1)
{
numbers += 3; // (2)
}
int main()
{
int* a = 10; // (3)
showInt(a); // (4)
return 0;
}
(1)numbers
變量傳遞給這個函數變量的副本; (2)因爲(1)在numbers
上所做的所有更改將僅保留在此函數內;因爲(1)所有在numbers
上作出的更改將僅保留在此函數內;傳遞給這個函數的原始變量的值將保持不變!但請注意以下幾點:您不能更改傳遞給該函數的指針(a
)的值,而是通過該指針的副本(即numbers
),您可以更改它指向的值! 這是主要技巧 - 一旦你在函數內部有地址,你就可以在該地址寫入,並且在函數返回後這些更改仍然保留。在地址寫入包括指針解引用,但你幸運地沒有這樣做 - 我說'幸運',因爲你傳遞的地址只是內存中的任意地址(10)。如果您試圖在地址10處寫信,您的程序可能會崩潰。 (3)你已經聲明a
是「指向int的指針」類型,所以它的值應該是某個int
對象的地址。你在這裏犯了一個危險的錯誤,因爲你認爲10是一個int的有效地址,但你實際上並不知道該地址是什麼。
(4)您正在向函數傳遞變量a
的副本。函數將其值存儲在numbers
變量中並增加它。所以numbers
現在包含地址13(不是某個整數變量的值是13的地址!)。 a
但仍然相同,它仍然具有相同的值,10
你可能想是這樣的:
void showInt(int* numbers)
{
*numbers += 3; // (1)
}
int main()
{
int a = 10; // (2)
showInt(&a); // (3)
return 0;
}
(1)功能,在保持numbers
地址修改值。指針被取消引用。 (2)我們需要有一個int變量的有效地址,而不是隨機選取的地址(如10)。因此我們聲明int變量,a
。它的地址是&a
。
(3)的地址a
通過可變numbers
傳遞給showInt
和功能現在可以寫入到該地址(這是現在int對象的一個有效地址 - a
)等修改的a
值。函數返回時,a
的值爲13.請注意,a
的地址在此處的任何時間點都不會更改。
您需要該函數的名稱。 –
@TommyA是的,對不起,我注意到並編輯了它:P – Danny
無論你怎麼想'int * a = 10;'都行,不這樣做。 –