我想知道在C中的main()代碼的這兩個版本之間的區別:這些例子(*和&)有什麼區別?
int main() {
uint32_t a;
f(&a);
}
和
int main() {
uint32_t *a;
f(a);
}
的功能
void f(uint32_t *pointer) {
// ...
}
我想知道在C中的main()代碼的這兩個版本之間的區別:這些例子(*和&)有什麼區別?
int main() {
uint32_t a;
f(&a);
}
和
int main() {
uint32_t *a;
f(a);
}
的功能
void f(uint32_t *pointer) {
// ...
}
在你的第一個例如,您將一個指針傳遞給未初始化的變量a
。例如,f()
可以在那裏存儲值,並且main()
可以稍後使用該值。
在你的第二個例子,你傳遞一個未初始化的指針a
。 f()
不能做任何有用的事情。
在第一個版本中,您將指向未初始化變量的指針傳遞給f()。 不要,除非f()的任務是初始化變量。
在第二個版本中,您將一個未初始化的指針傳遞給函數f()。 不要。
他們正在定義不同類型的變量,沒有初始化。
uint32_t a;
定義了uint32_t
變量在堆棧上,函數調用會將其地址傳遞給f()
函數。
uint32_t *a;
定義堆棧上的指針,它的值傳遞給函數。指針沒有初始化,因此它可能指向任何塊,任何嘗試訪問該地址都會導致未定義的行爲。
從f()
功能的角度來看,它看到傳遞給它的指針值。在第一次通話中,它可以使用該地址,而在第二次通話中,則不能。
wee指針問題!!!
好了,所以你知道,函數f需要採取一個指針,它是完全一樣的聲音的地址在內存中的實際位置。對於第一個示例(f(&a)),您必須傳遞地址,因爲它位於堆棧內,並且實際上不會在該函數生命週期外的任何地方共享。所以當函數返回時,內存被銷燬並且不再可用。指針的值不會被傳遞,只是指向該值的指針被傳遞。這可能會導致問題,因爲如果您更改該值,則「指向它」的所有內容現在都會更改。
現在對於第二個你從堆或者其它任何記憶,但是存儲的值而不是實際值的地址,所以你可以操縱它並返回任何結果和價值仍然存在。