2013-10-07 152 views

回答

11

在你的第一個例如,您將一個指針傳遞給未初始化的變量a。例如,f()可以在那裏存儲值,並且main()可以稍後使用該值。

在你的第二個例子,你傳遞一個未初始化的指針af()不能做任何有用的事情。

4

在第一個版本中,您將指向未初始化變量的指針傳遞給f()。 不要,除非f()的任務是初始化變量。

在第二個版本中,您將一個未初始化的指針傳遞給函數f()。 不要。

2

他們正在定義不同類型的變量,沒有初始化。

uint32_t a;定義了uint32_t變量在堆棧上,函數調用會將其地址傳遞給f()函數。

uint32_t *a;定義堆棧上的指針,它的值傳遞給函數。指針沒有初始化,因此它可能指向任何塊,任何嘗試訪問該地址都會導致未定義的行爲。

f()功能的角度來看,它看到傳遞給它的指針值。在第一次通話中,它可以使用該地址,而在第二次通話中,則不能。

2

wee指針問題!!!

好了,所以你知道,函數f需要採取一個指針,它是完全一樣的聲音的地址在內存中的實際位置。對於第一個示例(f(&a)),您必須傳遞地址,因爲它位於堆棧內,並且實際上不會在該函數生命週期外的任何地方共享。所以當函數返回時,內存被銷燬並且不再可用。指針的值不會被傳遞,只是指向該值的指針被傳遞。這可能會導致問題,因爲如果您更改該值,則「指向它」的所有內容現在都會更改。

現在對於第二個你從堆或者其它任何記憶,但是存儲的值而不是實際值的地址,所以你可以操縱它並返回任何結果和價值仍然存在。