1 *号的意義
2 傳值調用與傳址調用
3 常量與指針
4 小結
在本系列第一篇部落格中講到變量的本質是一段存儲空間的别名,那麼是不是必須通過這個别名才能使用這段存儲空間呢?
我們先看一個問題?下面的程式輸出什麼,為什麼?
我們來實際編譯運作一下:
可以看到我們并沒有改變變量 i 的值,而是通過指針 p 修改它所指向的記憶體空間(就是變量 i),也就是修改了變量 i 的值。因為指針 p 指向變量 i
在指針聲明時,* 号表示所聲明的變量為指針
在指針使用時,* 号表示取指針所指向的記憶體空間中的值
可以這樣了解,記憶體就是一間房子,變量就是房子裡面放的東西,指針就是門牌号。定義指針就是拿到了一個門牌号,指針 p 指向變量 i,就是将這個門牌号裝在了存放變量 i 的房子上,當然可以取下來裝在别的房子上,也就是指針 p 指向了另一個變量。* 号就是一把鑰匙,通過這個鑰匙就可以拿到房子裡面的東西,這就是 *p 解引用。
指針 p 儲存着變量 i 的記憶體位址,可以這麼了解
p 等價于 &i
*p 等價于 i
下面看一個指針使用示例:
編譯運作結果如下:
上面的程式,指針 pi 的值和變量 i 的位址是一樣的,pi 和 &i 等價,* 号是鑰匙,*pi 拿到了房間的鑰匙,并更換的房間的東西,由 0 變成 10 可以看到不管定義什麼類型的指針,指針大小是一樣的,也很好了解,不管房子是多大的,裡面放的什麼東西,門牌号長度都不會變,不能因為你住的是豪宅就換個賊長的門牌号吧 32位系統指針長度為 4 位元組,64 位系統指針長度為 8
指針是變量,是以可以聲明指針參數
當一個函數體内部需要改變實參的值,則需要使用指針參數
函數調用時實參将複制到形參
指針适用于複雜資料類型作為參數的函數中
下面看一個指針使用的示例,:利用指針交換變量
注意,千萬不能寫成如下代碼:
這樣是達不到交換目的的,采用值傳遞時,形參是實參的拷貝,改變形參的值不影響實參的變化。因為形參有自己獨立的存儲空間,作為函數内部的局部變量,在函數調用結束後就被釋放,是以不影響實參的值。 是以 swap(int a, int b) 函數中 a, b 的交換不會影響到 main() 函數中。
通過幾個例子來學習 const 修飾指針的情形
上面的内容不用死記,隻需要看清楚 const 修飾的是誰就可以了。如果 const 修飾 *p,則 *p 不可變;如果 const 修飾 p,則 p 不可變;如果兩個都修飾,都不可變
下面就來實際操作一個,看下面代碼中,哪些行會報錯
根據前面的知識,我知道,*p1, *p2, p3, *p4, p4 被 const 修飾,是不可修改的,下面就編譯一下,看看我們的分析是否正确。
編譯結果在第 10,13,17,19,20 行報錯,和我們的分析結果完全一樣
1、指針是 c 語言中一種特别的變量
2、指針所儲存的值是變量的位址
3、可以通過指針修改記憶體中得任意位址内容