函式引數傳遞的只能是數值,所以當指標作為函式引數傳遞時,傳遞的是指標的值,而不是位址。
#include"stdio.h"
void
pointer
(int*p
)int
main
()
輸出結果:
the b address 28ff3cthe p is point to 0028ff3c , addr is 28ff38, *p is 22
enter function
the p is point to 0028ff3c , addr is 28ff20, *p is 22
the p is point to 0028ff3c , addr is 28ff20, *p is 11
the p is point to 0028ff0c , addr is 28ff20, *p is 11
function
return
the p is point to 0028ff3c , addr is 28ff38, *p is 11
%p為指標所指向的資料的位址,這裡既為變數b的位址。
在沒有進入pointer函式之前,變數p儲存的值為28ff3c,變數p的位址為28ff38,*p的值等於b的值等於22
進入pointer之後,p所指向的記憶體位址沒有改變,但是p自身的位址變了。意味著函式傳遞只是將28ff3c傳遞進來了。雖然這個指標變數名字還是叫做p,但與main函式中的指標變數已經不一樣了。這意味著,你可以改變main函式中b的值,但是不能改變p的值
先看乙個例子
#include"stdio.h"
void
getmemory
(char*p
,int
num)
void
main
()
getmemory這個函式是呼叫malloc申請一塊記憶體。乍一看好像沒什麼問題,編譯也不會報錯。但是執行起來,程式直接奔潰。 其實有了上面的分析就可以知道,getmemeory中的p是不能改變str的指向的,也就是說str還是指向null。getmemory中的p是臨時申請的乙個指標變數,當str傳值進來(null),時,p指向null,除此之外,沒做任何改變。當執行malloc函式後,也只是將malloc返回的的指標位址賦給了p,並不能傳遞給str。所以這裡就需要指標的指標了
#include"stdio.h"
void
getmemory
(char**p
,int
num)
void
main
()
這個時候就是將指標變數str的位址傳遞了過去,而不是將指標變數的值(null)傳遞了過去,因此就可以改變str的指向了。
指標作為引數傳遞
如果想通過函式呼叫得到n個要改變的值,可以採取下面的步驟 在主調函式中設n個變數,用n個指標變數指向它們 編寫被呼叫函式,其形參為n個指標變數,這些形參指標變數應當與主調函式中的n個指標變數具有相同的基型別 在主調函式中將n個指標變數作實參,將它們的值 是位址值 傳給所呼叫函式的n個形參指標變數,這...
指標作為函式引數傳遞
值傳遞,指標傳遞?這幾天在學習c過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解 源 如下 createnode binnode tree,char p 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤...
指標位址作為引數傳遞
在做gpu cuda 高效能計算時遇到乙個問題 host 中分配的gpu變數怎麼在 host 間傳遞。其實這轉換過來是乙個函式間指標型變數的傳參問題。指標本身也是乙個變數,裡邊儲存的是位址,如果需要在函式間傳遞可修改自身位址的指標 指標型變數 那麼有兩種方法實現。取該指標的位址,作為乙個新的指標傳遞...