指標變數做函式引數,當我們在呼叫函式時,是如何改變main函式的變數值?使變數值改變的。

時間 2021-05-30 08:44:10

1樓:

我來嘗試通俗的解釋一下...

看得懂最好,看不懂就太傷心了

我有乙個玻璃匣子,匣子裡放著一些東西...匣子被鎖住了只有我能打得開...

現在,我把這個匣子遞給你(main呼叫swap)

你透過這個匣子,可以看到裡面的東西,比如說裡面放著錢吧...但是你看得見摸不著...

你把匣子還給我以後,我再給別人,錢還是錢...沒變...

好...我們把這個流程再來一次...

我還是把這個匣子遞給你...但是這一次,匣子裡放的不是錢,而是乙個保險櫃的密碼...

然後你通過這個密碼,開啟了放在旁邊的乙個保險櫃...把保險櫃裡面的錢都拿走了,還換成了一堆廢紙...

你看,我還是給了乙個玻璃匣子你...你也還是不能對匣子裡面的東西做任何改變...但是你這一次拿到錢了...而且還把錢換成了廢紙...

下次再有人來開啟保險櫃的時候看到的就是辛辛苦苦賺的錢被你換成了廢紙...

那你說,為什麼實參和形參之間只能單向值傳遞,但是指標能改變變數的值呢?

2樓:

沒看懂說啥, 是不是在main ()裡定義的變數, 是如何被其他函式修改的啊?

程式是先從main開始的, 變數都有自己的作用域, 你在main 中定義的變數是一直存在的,

直到main 執行結束;

在swap函式傳入的指標, 實際上是指向main裡的乙個變數或指標(乙個記憶體區域更好理解);

你修改的是指向 main ()裡定義的變數, main 結束後, 指向的變數被銷毀! (ps. 能理解就行, 嘴笨不嚴謹)

3樓:

事實上還是滿足的

首先變數pointer_1和pointer_2分別儲存了a和b的位址(pointer_1和pointer_2分別指向a和b)

由於指標也是普通的變數,因此傳遞指標的時候傳遞了指標的值(即指標所指向的位址),程式將位址拷貝給函式的引數,完成了引數的傳遞

在呼叫swap函式的時候,程式將pointer_1和pointer_2這兩個指標所指向的位址,作為引數傳遞給了swap函式

此時swap函式中p1和p2分別指向pointer_1和pointer_2所指向的位址,這時在swap函式中對p1和p2進行操作,就影響了main函式中a和b的值

4樓:Cyandev

swap中p1是指標形參,型別是(int*),實際就是乙個long值,儲存了那個數值的記憶體位址,然後*是取值操作符,就是直接指向p1所指的資料,去修改它。

PHP裡函式的引數變數是區域性變數嗎?

是,加global識別符號才是全域性變數,另外,php與js一樣無塊作用域,有函式作用域,這點要注意,比如for迴圈中unset全域性變數不需要加global var eechen 但要注意,引數以引用傳遞 進來的話,則該引數變數不會在函式結束時釋放記憶體.比如物件作為函式引數時預設就是引用傳遞,不...

C 如何將成員函式指標作為普通函式的引數傳遞?

BinGostar 將bar函式改為如下 void bar test pp tkzzz 可以定義乙個函式指標第乙個引數是void 然後傳遞的時候第乙個引數就是類位址因為在cpp裡面類成員函式的呼叫就是第乙個引數是類位址 具體如下 include template F void f2a F f fun...

二級指標傳入函式引數,為何執行結果為空呢?在不用陣列指標情況下,如何改變b陣列,並在主函式輸出呢?

魔某人 如果乙個東西是多維陣列,那麼像這樣的寫法 inta 10 9 a m n charb 11 45 14 b r s t 其等效寫法是 a 9 m n b 45 14 r 14 s t 而如果乙個東西是多級指標,那麼像這樣的寫法 int a a m n char b b r s t 其等效寫法...