1. 指標的來源
在當代,大多數的現代電腦都會把記憶體分割成位元組,每個位元組都有著其唯一的地址。可執行程式由代碼和資料兩部分構成,而程式中的每個變數都佔有著一個或多個位元組,也就是說,每個變數都有著自己的地址。而這個就是指標的來源。
其實每個地址就是一個數,但是我們卻不能用數來表示地址,儲存地址,我們需要用指標變數。例如int *p = i,我們就可以說p是指標變數,儲存著變數i的地址。
那麼我們說int *p中,p就是指向int 類型對象的指標變數。
2. 取址運算子和間接定址運算子
&,取址運算子,如果x是變數,那麼&x就是變數x所在的地址。
*,間接定址運算子,如果p是指標變數,*p就代表p所指向的變數的值。
當我們在程式中聲明int *p時,其實並沒有讓p指向任何地址,只是一個null 指標,我們也稱之為懸浮指標,在程式中,我們應該盡量避免這樣的狀況,應該盡量當聲明的同時進行初始化。否則當今後不小心對*p進行賦值時,如果p恰好指向了某一塊系統記憶體位址,就會造成系統的崩潰。
其實我們第一次接觸取址運算子,應該是應用於scanf,現在我們來想想scanf(“%d”,&a)的含義,其實就是告訴scanf函數,要把讀取的值放到哪個地址的下面。
3. const保護參數
我們之前說過const代表常量,不允許改變,那麼我們也可以將const應用於指標參數上。例如:
void Test(const int *p)就代表*p是不可以改變的,意思也就是p所指向的整數不能被改變。
void Test(int * const p)則代表,p是不可以被改變的,也就是說p只能指向這一塊地址。
void Test(const int * const p)則代表,p只可以指向這一塊地址,並且這一塊地址的資料不能被改變。
4.指標作為傳回值
這裡我只提一點,不要反悔局部變數的指標變數,因為局部變數出了範圍馬上被回收,這時,該指標也就指向了一塊廢棄的地址。
當然,我們可以返回某些參數的地址,外部變數和靜態變數的地址。總之,要確保該指標指向的是一塊未經回收的地址即可。