好,那個指標變數是怎麼樣來用的呢?我們去看一下 一個int是這樣宣告,那我們可以宣告int說,好, 嗯,
iptr1它是一個指標變數,所以我們有一個指標元素。為什麼我們知道呢?因為前面有個*。
那另外一個呢,iptr2它也是一個指標變數, 所以我們可以,就可以開始這樣寫這種東西,就是說,iptr1是什麼呢?
我們把它指呢,指定為i的位址。也就是說,
iptr1並不是i,它指到的是i的位址在哪裡。比如說,i的位址在哪裡?
你可以在iptr1裡頭取得。那另外我們也可以看到說我們可以把指標變數 它的值assing給另外一個指標變數。所以現在iptr1,
iptr2都是指向i的位址,都是指向i的位址。
好,這個就要特別注意就是說我們可以把它的,那個,一個整數 的位址找出來,然後assign一個指標變數。
所以指標變數專門指人家的位址。
好,那另外要講解的是這個*這個operation。
這個*operation是什麼?星號operation是什麼?就是說,從iptr1、iptr裡頭取值。就是說
你現在指到哪裡,你就指到哪裡,我到哪裡頭去把那個值拿出來。
那這個可以出現在等號的左邊或右邊這個、這個是意思有點不太一樣,所以,
當我們把這個iptr 加到*裡頭意思就是說把iptr裡面的值呢
當作一個具體位址,然後去裡頭呢把那個真正的值找出來,然後assign給i。
那如果它出現在等號左邊呢?事實上是說,我現在把i的值拿出來assign
指定給iptr現在指到的那個地方。你可以這樣想,你把這個東西想成iptr
是一個位,是一個那個地址,比如說是那個台大,是羅斯福四段一號,那,
這個*是那麼意思呢?就到羅斯福四段一號找說那有沒有放我的什麼。
或者說,這時說你把i值拿出來,然後指定到 羅斯福路四段一號裡頭去,這樣,所以iptr你可以把它想像成一個地址。
那加上*以後呢就是說,這個地址裡頭到底有什麼 好,所以iptr可以出現在左邊跟右邊。那在右邊的話
就是把它拿出來,在左邊的話就把它寫進去。你把它想成地址就對了。
所以
如果ptr是一個指向某個資料類別的指標變數,那*ptr就像一個
該類型變數的,嗯,該類型的變數。其實我們可以回頭看,如果你把這個東西
想成一個int那就通了。好,就是說這個整個是int所以它可以assign。
那著整個是一個int,那它也可以assign。那一般想到說 iptr不是int,但是iptr加一個*以後就是一個int。
那這個我們可以回到前面它宣告的一段作為呼應。
iptr不是int,但是,你加上*以後呢就是一個int,就是int。
fptr不是一個,呃,浮點數但是在加上*以後 它就是一個浮點數。這樣子。
那程式在使用記憶體的時候,能使用記憶體的 範圍是有一定的範圍的,所以我們必須假設iptr呢
要指向一個變數,這時候才能到裡頭取值。
也就是說,你要確定你的地址是對的,你才能到裡頭去拿東西。比如說,你,嗯,不能說羅斯- 福路8段一號,
因為羅斯福路沒有八段,羅斯福路只有大概到6段而已。所以,你現在如果跟人家講八段
位址就不對了。所以你要確定你的位址是對的,你才能到位址裡頭去拿東西。
好,所以如果一個指標沒有通過正確的被初始化的話,它的值極有可能出現在不正確的範圍,- 就無法從記憶體正確的取值。
。 那我們現在來看一個例子,就是說,有的時候呢我們希望一個程式能夠
在把一個指標變數不指向任何有效位址。也就是說,如果你真的下去拿會拿錯。比如說,
這可以說,絕對不存在的地方。在C裡頭有一個特殊值叫NULL
這個值是定義在stdio.h應用所以要引進這個標頭檔,好。
你如果這樣寫下去的話,就是剛才講說現在這個pointer絕對不指任何地方
所以我等下可以檢查說到底是不是指到一個特殊的地方,這個地方絕對不能放值的。
那如果是這樣的話,我就說好以後拿用*,用*ptr去拿值的話會有錯誤。
這樣的話就可以了。所以我們希望指標變數不指向任何有效的位址的時候 ,我們就把它初始化成特殊值,
這樣的話它將來去取值的時候就會產生錯誤,這一下我們來看一個例子。比如說,我們現在寫一個程式。
它其實是一個主程式,然後有一個iptr。然後,iptr我宣告成 那我把它初始化成NuLL, 然後等下你去拿值。
這時候就應該會發生錯誤,因為iptr現在沒有指向任何一個有效的位址,它是一個NULL.
所以你一取值的話,執行到這裡的時候就會發生錯誤。
好,這個 程式在這裡,就是在這裡,如果我們把它執行下去的話
執行下去 好,就發生錯誤了。因為它真的不知道這東西會是在哪裡。
那如果說,我們幫它指向一個有效的位址,比如說,我們讓它指到i的位址,然後我們給它一個
這樣子的話,這樣意思就是说 iptr現在指到i的位址,然後
我把i的位址放6,像這樣的位址,把它
放進去。好,這時候,它就知道說 好,iptr是等於6,
因為這時候這個iptr已經指到有效位址,因為我都已經給它一個i的位址
i在這裡,哦,很清楚明白確實是存在的。而且它的值是6。所以我到裡面去 拿值的時候就拿到這個6了。