- 記憶體中的每個位置由一個獨一無二的地址標識,記憶體中的每個位置都包含一個值
- 高階語言通過名字而不是地址來存取記憶體的位置,名字與記憶體位置之間的關聯並不是硬體所提供的,它是由編譯器爲我們實現的,硬體仍然通過地址存取記憶體位置
- 指針儲存的是其指向的地址,通過間接存取操作符*才能 纔能得到其指向地址中的內容
int a = 112,b = -1;
float c = 3.14;
int *d = &a;
float *e = &c;
表達式 |
右值 |
型別 |
a |
112 |
int |
b |
-1 |
int |
c |
3.14 |
float |
d |
100 |
int* |
e |
108 |
float* |
*d |
112 |
int |
*e |
3.14 |
float |
- 在你對指針進行間接存取之前,必須非常小心,確保它們已被初始化!
如果變數是靜態的,它會被初始化爲0;但如果變數是自動的,它根本不會被初始化。
標準定義了NULL指針,它作爲一個特殊的指針變數,表示不指向任何東西。對一個NULL指針進行解除參照操作是非法的。
如果你已經知道指針被初始化爲什麼地址,就把它初始化爲該地址,否則就把它初始化爲NULL。
風格良好的程式會在指針解除參照之前對它進行檢查,這種初始化策略可以節省大量的偵錯時間。
指針的指針
int a = 12;
int *b = &a;
int **c = &b;
表達式 |
相當的表達式 |
a |
12 |
b |
&a |
*b |
a,12 |
c |
&b |
*c |
b,&a |
**c |
*b,a,12 |
- 間接存取操作符
*
是少數幾個其結果爲左值的操作符之一。
- 當一個指針和一個整數量執行算術運算時,整數在執行加法運算前始終會根據合適的大小進行調整,這個」合適的大小「就是指針所指向型別的大小。
- 指針運算只有作用於陣列中其結果纔是可以預測的。
- 如果兩個指針都指向同一個陣列的元素,那麼它們之間可以相減
宣告一個指針變數並不會自動分配任何記憶體。