指針擁有「值」與「地址」雙重屬性,賦予 C 語言直接操作內存的能力,也引發無數錯誤。核心在於時刻明確:當前使用的是指針的值(地址),還是其指向的值?
& 取地址(需左值),用於初始化。* 取值,返回左值。指針賦值 vs 值賦值:p1 = p2 令兩指針指向同一地址;*p1 = *p2 將 p2 指向內容拷貝至 p1 指向內存。指針本身佔用存儲空間(32 位系統 4 字節),存儲所指對象地址。
指針運算 與所指類型相關:p++ 步進大小等於 sizeof(*p)。
聲明 int array[5] 分配內存;int* p 僅分配指針變量本身,不分配目標內存。數組名非左值,不可賦值;作為函數參數時退化為指針(char* argv[] 實為 char** argv)。跨文件聲明時,extern char* myname 與 char myname[] 內存佈局不同,必須保持一致。
#include <header>:系統庫頭文件,搜索標準路徑。#include "header":用戶頭文件,優先搜索當前目錄。內部衛哨(頭文件內):#ifndef _HEADER_H_ #define _HEADER_H_ ... #endif 防止重複包含。
外部衛哨(包含處):#if !defined(_HEADER_H_) #include <header> #define _HEADER_H_ #endif 提升編譯速度。建議兩者使用同一宏名。
頭文件中:自定義 → 第三方庫 → 標準庫。
源文件中:對應頭文件 → 自定義 → 第三方庫 → 標準庫。
避免重定義錯誤,善用 #ifndef 保護。
構造順序:分配內存 → 初始化列表初始化成員 → 進入構造函數體執行賦值。
必須使用場景:
1. 成員無默認構造函數(僅有帶參構造)。
2. const 成員或引用成員(聲明即初始化,不可賦值)。
效率考量:初始化列表直接調用構造函數;構造函數體內賦值則涉及默認構造 + 拷貝賦值,對類類型成員開銷大。
順序陷阱:初始化順序按成員聲明順序,而非列表書寫順序。保持一致避免微妙 Bug。
<iostream.h>,使用標準 <iostream>(模板化、命名空間 std、接口改進)。const:允許綁定臨時對象,防止意外修改。if (++x, --y, cin.good()) 取最右值;慎用以免降低可讀性。typedef 分層簡化(如 typedef void (*pfv)(); typedef void (*pf_taking_pfv)(pfv);)。int A::*pmi = &A::num; 數據成員;int (A::*pmf)() = &A::func; 函數成員。支持多態,不可取構造/析構函數地址。delete 與 delete[]:數組必須用 delete[],否則行為未定義。bool, bool, int 比 bool, int, bool 節省 4 字節)。delete 基類指針不會調用派生類析構函數,導致資源洩漏。friend class Nested;,否則編譯器忽略後續聲明。