&
運算符是「運算符的地址」。所以&a
意味着address of a
,而不僅僅是一個值。
這是告訴你的是,地址是1002
(或作爲dreamlax指出,很可能不是真正的地址,由於與如何使用printf的怪異),即使值爲10
。請注意,這兩個值之間沒有嚴格的相關性,您可以輕鬆地擁有a=121765
和&a=494260
。
瞭解變量的地址可以讓您操縱變量「引用」或「指向」的特定值/對象。如果你想要一個函數來操作那個特定的值/對象而不是操作一個副本,你應該傳遞這個變量的地址。
看看下面的代碼(不一定是完整代碼):
int main(void)
{
int a = 10;
doIt(a);
printf("after doIt: %d", a);
doItByReference(&a);
printf("after doItByReference: %d", a);
}
void doIt(int val)
{
val = 13;
}
void doItByReference(int *val)
{
*val = 15;
}
調用doIt
經過a
持有的價值,並在不同地址的新整數變量被複制到它該值。該功能可以自由對該副本進行任何更改,並且在原始a
變量中不會看到任何修改。
但是,撥打doItByReference
傳遞的地址爲a
。對給定地址處的值所做的任何更改都會反映爲對a
所做的更改。
如果您想對給定對象進行更改並將這些更改反映到原始副本中,這本身就很有用。但是,即使您不想修改原始副本中的值,這也是非常有用的性能,因爲您可以避免必須複製任何值。對於一個簡單的int,可能是4個字節(確切的值不重要),這是不重要的。
但是,說你有一個struct這是字節數以百萬計:
struct LargeStruct
{
int buffer[134217728];
};
void doIt(LargeStruct buffer)
{
// ... do something
}
void doItByReference(LargeStruct *buffer)
{
// ... do something
}
這一次,以doIt
每次調用將不得不復制整個LargeStruct
對象,它是數百萬字節,這裏,作爲對doItByReference的調用只需使用現有對象,並且不需要複製。
你的程序處理不同類型的數據有未定義的行爲。 '%u'需要一個'unsigned int',而不是'int *'。 –
在你的問題中沒有任何數組。 – dreamlax
也沒有'n'的定義。 –