個人覺得 C 語言最神奇的地方是有好些個對等寫法
類型 | 相關運算子 | 寫法一 | 寫法二 | 說明/宣告 | |
---|---|---|---|---|---|
1. | (變數)取址 | "&" | p | &x | p 為指標, 並且指向變數 x |
2. | (指標)取值 | "*" | *p | x | 同上 |
3. | 陣列與指標 | "[]" and "*" | p[n] | *(p+n) | p 為陣列變數或者指標變數 |
4. | 結構成員 | "->" and "." | p->x | (*p).x | p 為指標, 並指向一結構x 為該結構成員 |
上列幾個類型的寫法一和寫法二是對等的 (注意: 我用對等是因為有些不是全然相等喔!).
第一項 (變數)取址和第二項 (指標)取值基本上是一體之兩面: 使用變數 x 時, x 代表的是值, 其位址以 &x 表示; 而使用指標 p 時, p 代表的是 (某一個變數的) 位址, 其值 (該變數的值) 則以 *p 表示.
使用變數和使用指標基本上是的不同. 使用變數是存取固定的位址其內容值是變動的, 而使用指標的目的則是希望可以處理不同的變數, 因此位址是變動的 (或者換句話說是間接取存固定的位址).
對大部份的 CPU 來說, 存取固定的位址是以比較快速的直接定址來完成, 而存取變動的位址則以相對比較慢的間接定址來完成. 現今大多數的 CPU 也都有支援直接定址及間接定址這二種定址模式.
第三項陣列與指標, 在這裡所提的二種寫法是完全相等的, 不論變數是以陣列宣告的或者是以指標宣告, 二種寫法都可以共用.
(註: 請小心, 指標變數和陣列變數基本上並不相同, 只有 "指標的偏移計算" 和 "陣列的索引計算" 是相同的, 但是在此因為是針對同一個變數, 所以這二種寫法所產生的目的碼會是一致的, 全等的. 參看:...)
第四項是以指標存取結構成員, 這二種寫法也是全等的.
弄懂以上這幾種對等寫法的組合運用及轉換, 再配合小括號及運算元優先順序保證 C 語言的功力大增.
文章標籤
全站熱搜