[英]What's the difference between these examples (* and &)?
我想知道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()
函數的角度來看,它會看到傳遞給它的指針值。 在第一次調用中,它可以使用該地址,而在第二次調用中,它不能。
指針問題!!!
好的,所以你知道函數f需要一個指針,它與內存中實際位置的地址完全相同。 對於第一個示例(f(&a)),您必須傳遞地址,因為它位於堆棧內部,並且在函數生命周期之外的任何地方都不會共享。 所以當函數返回時,內存被銷毀並且不再可用。 只傳遞指向值的指針,不傳遞指針的值。 這可能會導致問題,因為如果你改變那個值,那么所有“指向它”的東西現在都會被改變。
現在對於第二個你從堆中獲取內存或者從哪里獲取內存,但是存儲值的地址而不是實際值,這樣你就可以操作它並且什么也不返回,值仍然存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.