好,我們再下來講解一個稍微複雜一點的例子,我們這個例子呢,有兩個變數,一個叫
i 一個叫k,另外兩個指標變數, 就是 iptr1 跟iptr2,它們這兩個都指向整數,
然後我們先開始把那個i 讀進來,記得我們這邊要加一個那個 npercent, 好,那我們在這個例子,我們讀進來是
5 , 這裡輸入是5 , 然後再來怎麼做呢,再來我們說,我們把
iptr1 呢的值這個初始化成那個i 的位置,
這個各位,各位特別看清楚,就是說i 的位置在哪裡我把它當iptr1 的值,那
iptr2 的值呢就是iptr1 的值所以現在兩個ipt 一個iptr1
一個iptr2 他們都指向i 的位置,就是我們這三行做的事情, 那我們如果拿一個圖來代表的話大概長成這樣子,
iptr1 iptr2 實際上我們剛才知道它佔八個位元,我們這邊是空格,這樣一個空格,綠色的空格呢
,是代表一個變數,這個藍色的空格呢,這代表八個 位元組,那這樣四,這樣四個位元組,這樣八個位元組呢,就是我們剛剛算多了
代表一個指標變數,所以i 是這裡k 是這裡iptr1 是這個,iptr2
是這個,這個藍的框框,那剛剛這件事情做完了以後會怎麼樣,因為我們把 i 讀成 5,所以 5 就進來了。
然後我們把 iptr1 指定為 i
的位置,i 的位置在哪裡呢? 我們這邊是它的位置,在記憶體的位置,它們在連續的記憶體。它記憶體是這個,
總共有八個那個位元組,前面,前面是零,所以它就在這裡各位注意看
這個再加上這個,所以這個東西就指到 i
的位置去了,所以 我們可以,在這個例子可以看到,這個指標變數裡頭的值呢,他並不是一般的資料,而是說
其他的記憶體在哪裡,所以當你說iptr1 的值是等於i 的位置的時候,就是這裡。
這就是i 的位置,這就是i 的值,它現在是5,所以呢事實上是把這個東西呢,
去把它搬到這裡來了,從這裡搬到這裡,搬到這裡。那 iptr2
的值應該變成iptr1 是這樣,就是把這個值把它整個就複製過來了。
所以做完這三行,這個現在記憶體有長得像這樣,注意到這記憶體裡頭都是 0
跟 1,完全沒有任何差別,也就是說我們解釋的時候我們把他解釋成這個是位置這個是資料。
好,這上面做完之後呢,我們就可以 直接去看它,直接印出來是什麼樣的東西,印出來東西在這裡。
,所以i 是印5,i 的位置是後面這個1538,
,各位可以看一下, i 的值是5,i 的位置是這個 1538 沒有問題, 再來呢 iptr1
的值是多少跟iptr1 的位置是多少,一個是538 一個是 540,這樣怎麼看呢?你看 iptr1
的值的位置是這個, 位置是這個, 它的值呢是這個,所以它的值指到
就是另外一個變數的位置,那iptr2 它的值,各位可以看到
它跟iptr1 的值是一樣的,因為我們剛才做了一個初始化,把iptr1
的值assign 給iptr2 所以它們倆現在一樣,然後 iptr2 的位置在哪裡,這邊有加一個位置,
那實際上是這個48 的位置上,那我們在48 的地方這八個位元組 就是跟那個iptr1 一樣,它現在就指到i 了。
,這個意思是這樣,所以各位由這個表就可以看出來說,
這個指標變數的裡面這個值,事實上就是另外一個變數的位置,在這裡。
所以一定要,這個東西,就是,這個東西,這個想清楚了就沒有問題了。
好,再來我們再來我們做什麼事情?再來我們把 iptr1
指到的地方assign 給8,注意我們不是把iptr1 指到8 而是iptr1 指到的地方assign 給8.
然後呢,把它印出來,然後印i 是多少,然後我們再把iptr2 指到的地方呢,
加上 3 assign 給 k 然後再把 k 印出來,看k 的位置跟k 的值是多少。
所以這是什麼意思?這個意思是這樣,我們剛才
把呃,iptr1 指到的地方,iptr1
在這裡,它指到的地方是這裡,把這裡的值加3 ,所以當你寫一個 star iptr 的時候,它實際上就是指這裡,因為
你加一個star 就是說到那邊去取值,那從這邊去取值 那就是這裡,這裡,這邊加一個3 就變成8 了。
那這邊,剛剛在這裡是說, 那如果現在
iptr2 的值再加 3 怎麼樣?你可以注意到 iptr2 現在 iptr1 都是指到
i 就等於到i 裡頭去把值拿出來然後assign 給
k ,所以 這個 iptr1 會拿到多少?因為它現在已經變成
8 了,所以把8 拿出來再加3 變成11, assign
給 k 了。所以iptr2 在這裡,你到這裡頭去取值, 這裡頭取值
1538 拿到的值是8 然後8 再加3 assign 給 k,就是這樣子所以結果就會這樣,所以各位可以看到,我們沒有直接對
i 跟k 做操作,但是我們可以藉由指標,再加上那個 star 再加上那個星號就直接對它進行操作,所以我可以透過
iptr1 跟iptr2 對這個i ,做一些預算跟操作。