搞懂一個指針,必須明確四個方面:
int *ptr → 類型 int*。*。如 int *ptr → 指向 int;int **ptr → 指向 int*。sizeof(ptr) 即可得知。ptr + n:地址增加 n * sizeof(指向類型) 字節。ptr - n:地址減少相應字節。ptr2 - ptr1(同類型指向同一數組):返回元素個數差值。& 與 *&a:取地址,結果類型為 a的類型*,指向類型為 a的類型,值為 a的地址。*p:間接訪問,結果類型為 p指向的類型,佔用地址為 p指向的地址。&a、ptr+1、*ptr)。*ptr 實際是某指針變量),則為左值,可放在賦值號左邊;否則為右值(如 &a)。array 有雙重含義:① 代表整個數組(類型 T[N]),用於 sizeof(array)、&array;② 退化為指向首元素的指針(類型 T*),用於 *array、array+i。int (*ptr)[10] 是指向整個數組的指針,類型為 int(*)[10],sizeof(*ptr)==40,sizeof(ptr)==4。ptr->member(ptr 類型為結構體指針)。int* 逐字節/字訪問——不可靠,因編譯器可能插入填充字節對齊。int (*pfun)(char*, int); pfun = fun1; 調用:(*pfun)("arg", 7);*p 影響實參指向對象;修改 p 本身不影響實參指針。(TYPE*)ptr 生成新指針,類型改為 TYPE*,地址不變。原指針屬性不變。&a(int*)傳給形參 char*,編譯器內部構造臨時指針完成轉換。ptr = (TYPE*)addr_int、addr_int = (uintptr_t)ptr(需 stdint.h)。char 強轉 int* 寫入 4 字節)。sizeof(源類型) < sizeof(目標類型) 時,通過目標指針訪問源內存會越界。NULL 或合法地址)。NULL。void* 強轉。const 修飾只讀指針。offsetof/成員名訪問,勿手算偏移。-Wall -Wextra -Wpedantic)並視作錯誤處理。