好,我們現在再舉個例子,
我們現在有一個那個函式叫pointer_inc就是說我們得怎樣利用這個pointer
來把那個一些變數作用那個增加值的操作啊。
所以它有兩個參數,第一個參數叫P1,第二個參數叫P2,它們兩個都是那個
指到整數那個指標,首先我們把P1和P2的位置把它印出來,然後呢把它的現在的值
也印出來,所以P1和P2兩個都是變數,當然有變數 就有位置跟指法印出來,然後我們把P1指到的地方吶我們把它加1,
然後把P1值改成P2,然後把P1指到的地方吶再加2,看會怎麼樣啊。
那這個是整個pointer_inc 這個函式的動作。
然後我們就開始主程式,主程式的部分有兩個變數叫i跟j,然後呢它有一個值標變值是
iptr,它一開始初始化的時候是住著i的位置,然後我們把i跟j都讀進來,
在這裡呢我們就讀10跟20,啊在這裡,然後呢我們就把i跟j的值
的位置印出來,然後把iptr的位置也把它印出來,把這三個的位置都印出來。
然後呢我們把i跟j印出來以後,然後我們呼叫一次pointer_inc 呼叫一次pointer_inc,這時候我們就注意到了
前一個參數是給iptr,後面一個參數給j,這是什麼樣的道理呢?是什麼樣的運作呢?
這會發生什麼樣的事情呢?我們看一個圖比較清楚啊,所以我們把i,j
跟iptr的位置印出來,所以是9c0,9c4,9c8,
在這裡啊,9c0,9c4,9c8,那麼沒有問題,然後i跟j 我們剛剛讀進來10跟20,然後我們就把那個p1跟p2的值
要加以考慮了。注意到我們p1的,P1是形式參數,
那實際參數是iptr,所以它就把iptr的值拿出來assign給它,
所以它會,這最後就會經過這步以後那p1的值就會變這樣了,就變1592a9c0,
那這裡啊,這裡。那P2的值會是多少呢?我們是拿什麼東西code
去變P2的?是拿j的位置去的,注意到在這裡,你看P2在這裡,P1在這裡,
所以P1的初始值iptr的值就是i的位置, 那P2的初始值會是j的位置,那j的位置是什麼呢?
在這裡,j的位置是呃這個a9c4,所以我們把a9c4 assign過來了啊,這邊這個樣子了,
這邊這個樣子了,所以這兩個值,一個是從iptr值來的,一個是從j的位置來的,
好這都沒有關係,它們都是現在,都是指向,一個指向i,一個指向j,
所以這個就指向i,那p2呢就指向j,各位可以看一下,
所以這個位置跟這個是一樣的,
好那這個位置吶,剛剛你當然拿這個東西assign,結果當然一樣就是這樣了,
所以p1p2現在個別指到i跟j,這樣沒有問題。
所以程式執行到這裡的時候,程式執行到這裡的時候是這樣子的,然後它就進去
這個程式了,然後它就把p1跟p2的值印出來,跟p1,p2的位置也把它印出來,啊這四行,這四行我們看一下,
這四行執行出來呢就是會把p1p2 實際上p2的值跟位置啊,這是它的位置,這是它的值。
這是它的位置,這是它的值。好,我們看一下。
所以我們可以看到p1的位置是在,當然在另外一個地方,
是在另外一個地方,但是P1的值,你注意看, 是不是就剛好i的位置,在這裡,這是我們剛才
經由參數那個機制得到的,那P2的值呢
就是剛好是這個j的位置啊,因為我們是拿j的位置給它初始化的。
所以由這裡我們可以注意到, 這個iptr
i,j以及p1,p2它們都是存在不同的記憶體位置, 也就是說即使我們等一下P1,P2有修改
也不會影響到iptr,意思是說
這塊,這塊跟這塊,這三塊是不一樣的跟這五塊,1,2,3,4,5
這五個變數分別存在不同的記憶體,所以一會我們要把,即使我們怎麼樣把P1,P2改掉了, iptr還是不會改的,啊iptr還是不會改的。
所以我們這段程式吶,在這裡,我們把p1的值指到的地方
加1,然後把P2給P1,然後把P1指到的地方再把它加2,這會發生什麼事情呢?
這會發生的事情是這樣的,啊,我們初始化以後變成這樣了。
然後P1指到的地方會加1,P1現在指到了哪裡,它現在指到i,
它這裡就會加1,然後我們把P2的值assign給P1,
所以這邊就變成c40了,現在就指到j了,我再退回一步給大家看,
當P1指到j,但是我們記不記得我們有做一步把P1值改成P2的值,
所以這邊是要改成c4,你改成c4之後再把裡面的值加2,那自然就加到j了,
那注意到這時候就算它們改來改去iptr並不會影響
因為P1的值改變而改變了,因為它們存在不同的記憶體。所以iptr還是指到
i的,而不是指,而不會是受這個影響會指到j去了,這裡各位要那個
想清楚啊。所以我們剛剛程式執行到這裡啊,
進去以後呢,這邊把它加1,然後pointer改掉了,
然後再把這個值再加2,所以我們出來的結果呢,就是說 一個變11了,一個變22了,呃,一個變11,一個變22了。
在這裡
這個時候呢,它就會變22,再下來會發生什麼事情,再下來我們這個
再下來這個pointer這個就結束了,這時候就結束了,我們把i跟j印出來,我們把i跟j印出來
就是剛剛那個值,然後我們現在把iptr指到的地方把它加5,這時候到底是加i還是加j呢?
雖然我們在函式裡頭這邊有把point1,point2改掉, 但是iptr不改的,為什麼呢?你可以從這邊看得出來,
當初P1,P2改來改去的時候,iptr還是在這裡的,它是獨立的一塊記憶體,
所以經過這段事情以後,它還是指到i的,
這個沒有變的,所以你把它加5,呃就11加5變16了,所以當然 最後從16變成22,因為iptr1並不會因為P1P2的更改
而這邊有任何的差別,所以做到最後你看這個答案
最後,呃最後它加上的是i而不是j,雖然P1,雖然P2,
雖然P1後來也被改掉了,但是並不會影響到iptr的值,所以我們總結一下就是說
實際參數跟形式參數它是使用不同的記憶體的,所以實際參數iptr
是跟對應的形式參數P1是處在不同的記憶體位址。所以你改變另外一個並不會改變另外一個。
改變一個並不會改變另外一個。那雖然那個iptr跟那個
P1是不同的記憶體位址,他們都指向i,所以i會加1,
所以如果我們不在同一個記憶體,但是我們值相同,到時候
我們到指到的地方去更改的話是會影響到的。那形式參數P2拿到的值是實際參數
那個j的位置,所以P2指到j,那P2指到j了,所以等一下會把j加2,
這是之前那個動作。雖然P1已經改指向j了,但是這iptr還是指向i的,所以程式結束回來的時候,就是那個副程式結束回來的時候,
iptr沒變,它還是指向i,所以我會加,我會加到i,而不是j,也就是在這裡,這段code。
所以iptr還是指到i的,所以會加,加到i,而不是加到j啊。
所以這個例子如果仔細看的話,
這個只要有一個,最重要的觀念就是說它們存在不同的記憶體了,
它們存在不同的記憶體的話就可以把這個事情搞的很清楚了。