指標變數本質是整數(地址),支援加減、比較運算,但步長由指向資料類型大小決定。
#include <stdio.h>
int main() {
int a = 10, *pa = &a, *paa = &a;
double b = 99.9, *pb = &b;
char c = '@', *pc = &c;
printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
pa++; pb++; pc++;
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); // +4, +8, +1
pa -= 2; pb -= 2; pc -= 2;
printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc); // -8, -16, -2
return 0;
}
步長分別為 sizeof(int)=4、sizeof(double)=8、sizeof(char)=1。
指標指向 int a(佔 4 位元組)。若 pa++ 僅加 1,會指向 a 內部,解引用會讀取殘缺資料。加 4 才能完整跳過 a,指向下一個完整 int 位置。這對陣列遍歷極具意義:p+1 精確指向下一元素。
連續定義的變數在記憶體中不一定相鄰(編譯器可能插入填充/輔助資料),對其指標加減無實際意義,甚至讀取亂碼。
int a=1, b=2, c=3; int *p=&c;
for (int i=0; i<8; i++) printf("%d, ", *(p+i)); // 輸出亂碼夾雜 3,2,1
比較指標變數值(地址)。地址相等 → 指向同一資料。僅適用於指向同一陣列/物件的指標比較。
指標不可進行乘法、除法、取餘等運算,無語法意義亦無實際含義。