我們預期的結果是輸出兩個 a.
可是執行的結果卻是下圖。
為什麼只輸出了乙個a?
下面我們分析一下:
在fun1中,我們用malloc分配了一段記憶體,並將該段記憶體的首位址放在指標變數n,然後我們就用n這個位址,開始給結構體賦值。
在fun2中,我們以為在fun1中已經給node分配好了記憶體,也賦好值了。所以呼叫cout將其資料輸出。
貌似都沒有問題,符合指標傳遞的可以改變值的思想,一切很正確。那麼為什麼得不到預期結果??
簡單看一下引數傳遞型別
指標傳遞:
在指標函式引數傳遞 fun(int *p) 時,我們可以利用p來確定一段記憶體位址,然後直接將這段記憶體位址中的內容改變,這樣就實現了通過指標傳遞改變變數的值。
值傳遞:
如果傳遞的是fun(int i)時,我們在fun中有語句 i= 6,等出了函式,大家都知道i並不一定6,i還是它原來的值。
有了這個基礎,我們再來分析:
指標變數是乙個普通變數,只不過它儲存的內容是乙個記憶體位址。
在main函式中,node=0x00,
呼叫fun1後,在fun1函式中,給node(n)賦了乙個新位址,如n=0xff,等fun1函式呼叫完畢,node其實還是0x00。這個過程其實就是上面講的值傳遞,並沒有涉及到通過指標改變記憶體位址裡的內容。
為了達到預期的效果,也為了驗證以上闡述,我們修改**如下:
執行效果如下:
結果正確!
函式引數的傳遞問題(指標的指標)
程式1 void mymalloc char s 我想在函式中分配記憶體,再返回 s char malloc 100 void main char p null mymalloc p 這裡的p實際還是null,p的值沒有改變,為什麼?if p free p 程式2 void mymalloc cha...
指標引數傳遞的問題
內容如下 1 指標作為引數傳遞進去的僅僅只是指標的值,而不是指標的位址,或者說只是指標的乙份拷貝,例如 void pointer int p intmain the p is0xbfd46498 addr is 1076599652,p is 22the p is0xbfd46498 addr is...
關於指標傳遞引數的理解
學習c語言至今,已經到了乙個瓶頸,難度大多來自於指標和指標的引數傳遞。指標分為一維指標 多維指標 函式指標 指標陣列 陣列指標等等 其中主要我們要了解的是一維指標和指標陣列 陣列指標。include include void allocate memory for two array int plo...