資料在記憶體中需有唯一編號(地址),就像門牌號。32 位環境下位址範圍 0 ~ 0xFFFFFFFF(4GB)。
資料類型 *變數名; // 宣告 資料類型 *變數名 = 值; // 宣告並初始化
* 表示這是指標變數。資料類型 表示指向資料的類型。int a = 100; int *p_a = &a; // 取址賦值
指標可多次重新賦值指向不同資料。定義時必須帶 *,賦值時不可帶 *。
int a = 15;
int *p = &a;
printf("%d, %d\n", a, *p); // 15, 15
*p = 99; // 修改 a 為 99
printf("%d, %d\n", a, *p); // 99, 99
*p 代表指標指向的資料本身,等價於 a。使用指標屬「間接存取」(兩次運算:取指標值→取資料),直接用變數名屬「直接存取」(一次運算),指標成本略高。
int a = 100, b = 999, temp; int *pa = &a, *pb = &b; temp = *pa; *pa = *pb; *pb = temp; // 成功交換
臨時變數 temp 必不可少。
* 與 & 組合謎題*&a ≡ *(&a) ≡ a:取址再取值,回原點。&*pa ≡ &(*pa) ≡ pa:取值再取址,回原點。* 三大用途總結c = a * bint *p = &a*p = 100; b = *p定義時的 * 與使用時的 * 意義完全不同,請務必區分。