1樓:幹莘出佩
程式一可以實現a,b值的交換,程式二則不行。要想明白這個需要知道一下幾點知識:
1,變數的作用範圍;區域性變數(程式二中void
swap(a,b)子程式中的變數a,b,k都為區域性變數,生命週期從呼叫此函式開始,函式執行完變數得到登出。
2,函式引數的傳遞方式;以上兩個子程式引數傳遞方式都為值傳遞----把實參的值拷貝到形參。但在子程式中對形參的操作不影響實參。
3,指標變數的含義;所謂指標變數,即指向某一變數(整形,浮點型,字元型等等)位址的變數。也就是說,指標變數的值是某一變數的位址。
下面分析:
程式一:呼叫子程式後,形參通過值傳遞的方式獲取實參的值,既形參和實參儲存有同一變數的位址,在子程式中,對形參的操作都是間接對所指向變數進行操作,並非對形參本身的值進行操作。既可以改變a,b的值。
程式二:在子程式中,所有的操作都是對形參本身的值進行操作,當執行完後,形參(區域性變數)登出。
程式2:
2樓:長孫慧俊塞豪
主要是函式
void
swap(int
a,intb)與
void
swap(int
*p1,int
*p2)
的差別,
前面函式:只是將實參傳遞給形參,並不會返回(傳遞的是值)後面函式:是將實參的位址傳遞給形參,在程式中形參實際上操作的是實參的位址,所以程式中交換的是位址下的值,也就起到了互換的目的了
3樓:尚抒豐鶴
如果hl是指標則:
定義時void
initlist(lnode
&hl)
應該這麼用
initlist(*hl);
注意上面的*不是表示指標,而是表示取hl所指向的內容。
定義時void
initlist(lnode
*hl)
則應該這麼用
initlist(hl);
但這只是單純的從語法來回答你的問題的,對於你這個函式,我想函式的意圖是初始化乙個鍊表,並且頭結點hl初始為null。
那麼你這裡的引數hl就必須是個指標的引用或指標的指標了。
否則void
initlist(lnode
&hl)
的形式呼叫initlist(*hl)時會報錯(訪問無效位址)void
initlist(lnode
*hl)
的形式呼叫initlist(hl)時hl還是會為null(值傳遞,頭結點沒有返回出來),而產生記憶體洩漏。
為什麼指標可以改變實參的值,形參不能改變實參,為什麼在用指標傳遞數值的時候又可以改變呢?
通俗講指標作形參,形參裡儲存的是地址的值,這個值與實參的某個變數的地址是一樣的,所以當改變形參所指向的地址裡存的資料,其實改變的就是實參那個變數的值。而普通變數作形參,與實參中的變數其實是使用不同的儲存空間,所以當形參的值發生改變時,實參所在儲存空間的值並沒有發生改變。 應該是指標可以改變實參所指變...
形參和實參的區別是什麼,c語言中形參和實參是什麼意思?有什麼區別?
淳于長順印黛 實參是用來填充形參的。當函式被呼叫時,形參列在函式名後面的括號裡。執行函式呼叫時,實參被傳遞給形參。1 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。2 實參可以是常量 ...
c中實參和形參有什麼區別,c 中形參與實參的本質區別是什麼(例如儲存機理等)
無法無天 實參和形參被分配的位址不同。可以這樣比喻,實參是一間別墅,而形參是另一間別墅。實參裡的東西被複製了乙份搬到了形參裡面,而形參這件別墅裡面的東西被扔了或者新增了新的東西是不會對實參這件別墅造成影響的。如果不用指標或者引用,實參只能向形參裡面傳遞東西 值 就好比上面的舉例,實參的東西能拷貝乙份...