簡體   English   中英

這些例子(*和&)之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM