C和指針第6章-指針學習筆記

2020-08-08 22:41:15
  • 記憶體中的每個位置由一個獨一無二的地址標識,記憶體中的每個位置都包含一個值
  • 高階語言通過名字而不是地址來存取記憶體的位置,名字與記憶體位置之間的關聯並不是硬體所提供的,它是由編譯器爲我們實現的,硬體仍然通過地址存取記憶體位置
  • 指針儲存的是其指向的地址,通過間接存取操作符*才能 纔能得到其指向地址中的內容
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
  • 間接存取操作符*是少數幾個其結果爲左值的操作符之一。
  • 當一個指針和一個整數量執行算術運算時,整數在執行加法運算前始終會根據合適的大小進行調整,這個」合適的大小「就是指針所指向型別的大小。
  • 指針運算只有作用於陣列中其結果纔是可以預測的。
  • 如果兩個指針都指向同一個陣列的元素,那麼它們之間可以相減
  • 宣告一個指針變數並不會自動分配任何記憶體。