[聲音]
再下來我們介紹怎麼樣讓一個函式把
指標當作回傳值傳回來,之前我們的回傳值要不就沒有,要不就 integer。現在我們想說能不能把一個指標呢,把它傳回來
那這樣要怎麼做呢?我們先看下這個例子,這個例子是說,我如果給你一個指標,你就在後- 面一直找
找這些指標後面的一些整數,這樣一直找下去,找到第一個是正數,找到
第一個是正數,那你就把那個它的位址回傳回來。所以我們怎麼寫呢? 我們就寫說,我們現在有一個函式,叫做
first_positive 它的回傳值是什麼呢?它的回傳值是
integer,不過說它的回傳值是 integer 指標,所以你把這個 *
加在這邊 這個有點像我們在宣告一個變數的時候,這邊
加個 *,意思就是說等一下 first_positive
要回傳的值呢 是一個指標的變數,那我們丟進去,我們就丟一個
指標給它,然後呢我們就一直去找,找出這個指標指到的東西是不是大於等於 0
如果不是的話,如果是小於等於 0 的話 它就一直跑,所以當它大於 0
的時候,它就會停,停的時候呢 我們就把這個值,把它回傳回來,就把值回傳回來
所以我們就能在一個比如說陣列裡頭去找,找第一個 大於
0 的數字回來 那這個要怎麼用呢?我們可以看一個具體的例子,我們現在有一個陣列,它裏面有
10 個元素 裏面呢然後我們再宣告一個 iptr 當作指標,然後我們一開始先把這個東西
讀進來,讀進來的時候呢,我們是讀 0 0 0 5 9 0 0 6
0 2,好,這個大概記起來。然後呢,我們就把陣列
當作那個形式,當作
正確的參數,當作實際參數丟進去,然後呢,把它回傳值 給它丟給
iptr,這什麼意思呢?這相當於說我們陣列的頭,我們慢慢找,找第一個非 0
第一個大於 0 的數字,我們就把那個數字的位址 傳到 iptr
裡頭去。所以當我們想知道 iptr 指到的位址的時候,就可以用這個方法來做,所以各位
它不是回傳那個第一個非,第一個大於 0 的數字,而是
回傳它的位址,這個我們畫一個圖來解釋可能會比較清楚一點 所以一開始
pointer 是在這裡,pointer 在這裡,因為 pointer 一開始跟 array 是在一起的
以後呢,它就看後面是不是 0,不是 0 它就往後跳,它跳到這裡的時候它停住了
它停在哪裡呢?停在 array3 的地方,停在 array3 的地方,所以 pointer
這個 iptr 一開始是在這裡的,因為我們一開始告訴它說
你傳的時候是傳這個 然後等一下你把這個值丟給
iptr,所以等一下 ptr 會複製一份給 iptr,所以等一下 iptr
呢 就變成指在這裡了,因為 iptr 是接那個函式 first _positive
的回傳值,所以它指到這兒,這個時候呢 你現在說 iptr 跟
array 是差多少,把它印出來。那這個時候我們印多少呢?
這次我們印 5,因為我們一開始呢 它指到的地方是
5,但是它相減呢會得到 3
那是因為我們一開始讓它從這邊開始,這是所謂的頭,然後它在那邊停,它中間是差 3
格 這個意思等於是在問說,你停的地方離頭到底有幾棟房子? 結果,結論是
3 棟。因為你看,這邊就是 3 個,它從那邊進去,一直跳,一直跳跳到這裡
然後把值回傳出來,是 iptr 指到這兒,這中間差 3,這個數字是
5 所以在第一次執行的時候是這個樣子。那第二次執行的時候是什麼樣子呢?第二次執行的時候
注意到,它把那個實際參數設定為 array5
然後的位址,然後也是一樣回傳值給 iptr,那這是什麼意思呢?
這個意思就是說,你看這個圖,我現在把 array5
當作 ptr 的初始值叫它在裏面跑
讓它跳跳跳,跳到這邊會停,然後把值回傳給 iptr
所以相當於說我從哪裡進去,它一直跳,跳到最後它會停 我把,我利用那個函數回傳一個
指標的這個機制,把那個指標,把那個位址呢 指定給
iptr,所以等下 iptr 去拿的時候就會拿到這個 6
所以我們現在回來看這個 code,所以我把這個東西丟進去,然後呢
把它回傳值放到這裡,那等下 iptr 就會拿到 6,那中間差
幾格,差幾就是 5 到 後來那個 6 到底跳了幾次
那,等一下是在這裡,是在這裡 那我們剛才等一下相減是減哪個,是減
array,所以這中間一減就會 差到 7,就會差到 7,那是因為我們減
array array 是從頭開始,我們剛才事實上只跳了,大概
跳了兩格,但是我們現在是拿 iptr 去減這個 array array
的頭,所以中間差了幾,就是差了 7 格,就是這個 7 從哪裡來 所以我們每次減的時候是減
array,這就可以瞭解到說 iptr 事實上可以告訴你說它事實上,如果從
array 算是第幾格,當然如果從 array5 開始算的話,那就是第二格,但是你從
array 頭開始開始算,就是第 7 格,所以這邊也是一個例子,就是說 告訴你說這些
pointer 是可以互相減,互相減的意思就是說它們中間的相對位址到底差了幾格
的意思。所以我們第一次的時候我們是用 array
當實際參數,所以它事實上會 回傳那個 array3 的位址給我們,那這個位址,array3
具體位址會被指定給 iptr,所以它取值得到 5 那第二次的時候我們是用
array5 的具體位址當實際參數去呼叫 那就會回傳 array7 的具體位址,所以
iptr 取值就得到 6 由這裡看出來,我們第一次讓這個
ptr 從那邊開始,所以 ptr 到那邊結束,然後 ptr 把這個值回傳出來 丟給
iptr,它就得到 5,它中間就離 array 的開始就差 3
第二次我們讓它從這邊進去,就是 ptr 的一開始的值呢是
array5,那它這邊停,所以 那 iptr 跟原來一開始的
array 就差了 7,然後可以拿到 6,這各位可以,實際上
看一下這個例子就瞭解了,所以這個 iptr 是很,這個 ptr 是很重要的,它告訴你說你在
array 裡頭什麼地方開始跳 然後它把那個跳到的地方傳回來
這個機制要弄清楚。所以這個是一個 算是蠻簡單的例子,就是說你怎麼樣利用
傳這個指標的方式 一個函式讓它傳指標回來,你就可以得到這裡面的這些資訊
那這個圖事實上蠻清楚,各位可以看一下
這個圖,就知道說到底那個實際參數跟形式參數以及回傳值中間互相的關係
[聲音] [空白_錄音]